• Какая сущность в symfony security и Lexik JWT Bundle проверяет логин/пароль при входе?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Зачем вам разбираться, как работает сложный бандл. Вам нужно разобраться как это сделать минимальными усилиями. Могу лишь подсказать как это сделать. Потому что описывать как работает бандл долго и ни к чему.

    1. Делаете новый роут и в нем проверяете входящие данные. Если это логин и код из смс, то ищете эту связку в базе и если нашлась, то формируете JWT и отдаете frontend приложению.
    2. Делаете Аутентификатор, который берет заголовок токена из запроса, извлекает из него токен и проверяет его на различную валидацию: подпись, срок действия и т д

    Ну а дальше если есть вопросы можете написать их в комментариях.
    Ответ написан
    2 комментария
  • Модуль дописывает свой id во все URL. Как исправить?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Если правильно понял, то вопрос касается ссылок в HTML. Вам нужно ссылку использовать в не относительные. То есть все ссылки должны начинаться с /manage/module/site вместо manage/module/site
    Ответ написан
    2 комментария
  • Как лучше возвращать ошибку API?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    1. Если у вас есть доступ к беку, то вам лучше ошибки переводить на нем. Отображение ошибки в зависимости от локали. Переводить лучше тут, так как клиентов вашего api может быть много и будет очень странно если одна и та же ошибка на web будет переведена не так, как в mobile.
    2. Если у вас доступа к беку нет, то я бы на уровне ApiClient сделал обработку и перевод всех ошибок в одном месте. Например, axios может сделать это в одном месте.

    Но есть список ошибок, которые не нужно переводить и выводить их на frontend. Например, ошибки со статусом ответа от 400 до 499 могут быть отображены клиенту, а остальные особого смысла для детализации и перевода не имеют смысла.

    Кроме обработки статуса ответа можно ещё и смотреть на код ответа, как написали в соседнем ответе. Коды ответов не всегда удобны для простой разработки. Так как требуют дополнительной разработки со стороны api и дополнительной обработки со стороны клиента.
    Ответ написан
    Комментировать
  • Можно ли использовать микросервисы в таком случае?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Микросервисы, прежде всего, — это про масштабирование. Вам нужно сначала для чего вы хотите разделить код на сервисы и микросервисы. Если это хотелки, то это ошибка. Возможно вам просто стоит сделать хороший модульный монолит, провести рефакторинг существующего кода. При этом чтобы модули были слабо связанными между друг другом используя одну базу.

    В микросервисах модели, обычно, не повторяются. Вам может казаться, что Пользователь в системе Аутентификации и Автор в статьях Блога это одно и то же, но это не так. Поля сущностей могут быть похожи, но это разные контексты использования, соотвественно разные модели.
    Ответ написан
    Комментировать
  • Для чего в role и permission добавляют список значений?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Роли чаще всего это группа привилегий. Почему используют их вместе - зависит от системы. Иногда достаточно ролей. Например, если у вас одна админка и пользоваться ей могут только админы. Но если у вас один UI на несколько пользователей, то обойтись одной ролью будет сложно. Если вы будете в коде везде делать проверку, что пользователь админ и ещё сотрудник и ещё менеджер, то это будет сложно. К тому же при добавлении новой роли вам нужно будет по всему коду добавлять проверку ещё и на другую роль. Вместо этого используют разрешения, которые выдаются пользователю. В коже вам нужно проверить это разрешение/привилегию и вам без разницы какая это роль. Добавляете новую роль и привязываете новые разрешения. Пользователь сразу сможет использовать систему в зависимости от прав.

    То есть роли используют чаще для чего-то глобального и/или объединения разрешений. А сами разрешения уже позволяют гибко настраивать проверки.
    Ответ написан
    3 комментария
  • Как по запросу пользователя правильно отдавать данные для администратора и гостя?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Используйте JWT токен, в котором будет ID и роли. По пори проверяйте есть ли доступ администратора. В каждом запросе делать проверку не нужно. Это можно закрыть глобально по роли.
    Ответ написан
    6 комментариев
  • Что лучше для опроса статусов платежей, крон задача или отложенные сообщения через rabbitmq сервер?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Ни тот и ни другой. Переходите на Message Driven архитектуру. Вместо того, чтобы делать постоянные запросы кроном к сервису лучше сделайте публикацию события в RabbitMQ.

    В момент, когда платеж был выполнен публикуется интеграционное событие PaymentPaid. В это событие вкладываете все нужные данные, в том числе и ID по которым связываются платежи. Далее сервисы, которые заинтересованы в этих событиях подписываются на них и совершают нужные действия.

    При работе с RabbitMQ нужно помнить:
    1. Он гарантирует как минимум 1 раз доставить ваше сообщение. Это значит, что вполне может быть дубль и вам нужно быть готовым к этому. То есть делать идемпотентный консьюмер.
    2. Сообщение может быть не доставлено по причине недоступности сервиса очередей, так же и сообщение может быть потеряно, в том числе из-за недоступности сервиса. Поэтому вам нужно гарантировать доставку через Outbox.
    Ответ написан
    Комментировать
  • С чего начать планирование системы управления кафетериями?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Самый лучший способ это Event Storming! Это как раз будет связующее звено для понимания и вами и программистами. Конечно, лучше найти такого специалиста - Архитектора.

    По сути техника Event Storming — это воркшоп с простой структурой, на котором эксперты по предметной области и разработчики совместно исследуют эту самую предметную область. По мере исследования участники раскрывают всё больше неопределенности и скрытой сложности, сверяют предположения с реальностью и снижают влияние предположений на качество продукта.

    Event Storming применяется в исследованиях клиентского опыта, проектировании новых сервисов, получении знаний о работе legacy-систем, моделировании сложных предметных областей и проектировании микросервисной или событийной архитектуры.

    Техника предусматривает итеративность. Модель предметной области можно постепенно детализировать (уточнять) с каждой сессией. Участники меньше утомляются, сессии можно посвящать отдельным вопросам и приглашать нужных специалистов, брать паузы для исследований.

    Из своего опыта могу сказать, что ни раз даже помогало увидеть полную картину своего бизнеса. Сразу вырисовывается организационная структура, разграничение ответсвенностей и другое. Проводится довольно быстро. Это легче чем написать ТЗ. После проработки Event Storming можно уже давать задания для программистов, дизайнеров, маркетологов и др. Очень полезная техника для автоматизации. Всегда проще сначала нарисовать бизнес, а потом его автоматизировать.

    Если вы автоматизируете уникальный продукт, где есть своё ноу хау, то без этой техники не обойтись. Ведь выбирая что-то за основу и копируя её вы не доносите ценность вашего бизнеса. Для примера, ваша ценность может быть вовсе не в качественных и вкусноприготовленных блюдах, а в грандиозном сервисе подаче этих блюд. Тогда автоматизацию следует делать с большим упором на услуги. Или ваш ресторан наоборот может иметь самый быстрый сервис и подачу блюд. В этом случае упор будет другим. А может быть у вас в целом подход будет заключаться в управлении другими ресторанами (сеть). В общем брать что-то за основу и тем более слушать программистов не стоит. Программисты делают всегда то, как им удобнее и проще. Для вас же важно решить свои проблемы. Удвоить бизнес.
    Ответ написан
    Комментировать
  • Как синхронизируются данные из контейнера на хост и обратно в symfony-docker?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Не очень понимаю в чём вопрос) Том Docker – это каталог (или коллекция файлов), который находится в файловой системе хоста и не является частью UFS контейнера. Именно внутри этих томов контейнеры способны сохранять свои данные. С помощью команды docker volume вы можете легко управлять томами. Соотвественно куда вы прокините том - там и будут жить ваши данные на машине.
    Ответ написан
    Комментировать
  • Как хранить логи приложения на php?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Sentry, Elasticsearch+Logstash+Kibana. Больше особо нечего сказать)

    Для PHP есть библиотека Monolog, которая умеет легировать в разные источники.
    Ответ написан
    2 комментария
  • О чём архитектура ПО?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Первая ссылка похоже на правду. Вторая тоже относится к архитектуре, но как-то слабо описано.

    В целом архитектура нужна для того, чтобы проект и его код был понятен каждому. Чтобы доработки делались просто. Чтобы одна ошибка не приводила к смерти всего проекта. Другими словами Архитектура ПО (разработка архитектуры ПО), это искусство и наука строить и проектировать программное обеспечение таким образом, чтобы оно удовлетворяло всем заявленным к нему требованиям, а также обеспечивало максимальную простоту доработки, развертывания и масштабирования приложения.

    Архитектура и про код, и про технологии, и про инфраструктуру.
    Ответ написан
    Комментировать
  • Какой самый лёгкий и безопасный способ держать пользователя авторизованным?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Недолгоживущий JWT Access Token (5-15мин), который после того как просрочится сделает доступ к сервису невозможным.

    Но чтобы каждые 5 минут не простить залогиниться пользователя изобрели RefreshToken, который хранится в базе дольше. Примерно 1 месяц. Он нужен для того, чтобы выпустить новый JWT AccessToken. При взломе RefreshToken просто удаляется и новый AccessToken выпустить не получиться. Почитайте в целом про OAuth 2.0 + JWT
    Ответ написан
    Комментировать
  • Какие архитектурные решения можно применить?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Нет деления по слоям из DDD. Нужно отделять бизнес логику от инфраструктуры. Ответственно контроллерах минимум кода и никакой логики.
    2. Анемичные сущности, которые не имеют контроля над своим состоянием агрегата.
    3. Сущности знают про то где они хранятся. Если завтра мы начнем хранить данные в другом месте, то ваш код придётся переписывать.
    4. Про структурные паттерны можете почитать тут: https://refactoring.guru/ru/design-patterns/struct.... Там есть примеры на PHP.

    В целом могу сказать, что код пишется для человека, а не для машины. Поэтому не нужно бездумно писать код и раскидывать всё в разные папки по всему проекту. Выделяйте модули и ложите всё рядом с ним. Можете почитать про модульный монолит.

    Например, у вас Request размазан по разным папкам: Events, Models, Listeners и т д. Вам завтра скажут вынести модуль заявок в отдельный сервис или вообще его удалить. Вместо того чтобы удалить одну папку, то вам нужно во всех папках найти где есть Request. Конечно, это не удобно. Не говоря о том, то вся логика, в том числе и бизнес логика хранится по всему проекту. И это у вас простой код. А что если будет 100 разных модулей. С вашей структурой вы точно увязните. Плюс у вас будет куча конфликтов при разработке. Нельзя за каждым программистом закрепить папку, за которую он отвечает. Каждому программисту придётся лезть в соседнюю попку, потому что они общие. Ревью делать тоже сложно.
    Ответ написан
    2 комментария
  • Почему Symfony 6.2 не создает entity?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Там где mappings сущностей замените тип аннотация на атрибут. type: annotation -> type: attribute

    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App
                type: attribute <— ТУТ
    Ответ написан
    Комментировать
  • Как в реальных проектах хранят контанты, текста, телефоны и прочее?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    У вас вопрос про данные, а не про константы. Где хранить данные зависит от самих данных!
    1. Если нужно гарантировать их безопасность (например, персональные данные), то без хранилища не обойтись.
    2. Если нужно их менять не через код, то тоже нужна веб панель и хранилище.
    3. Если какие-то данные повторяются, то эти данные можно выносить в какие-то js/json файлы.
    4. Настройки проекта, зависящие от окружения, выносят в переменные окружения.
    5. Статические страницы вроде о нас и контакты меняются не часто, поэтому можно оставить их прямо в файлах.
    6. Требуются ли переводы контента и т д

    Это лишь часть описанных вариантов. Как бы вынес я, исходя ваших пунктов:
    1. Контакты в шапке (телефон, мейл, адрес) - если только там оставить прямо в коде. Если дублируются вынести в отдельный файл и его подключать.
    2. Структура меню (Главная О нас Блог и тд — названия пунктов меню и их href-ы) - внутри компонента меню, если нет требований менять из админки и переиспользовать компонент. В противном случае - хранилище или json файл.
    3. Текста на страницах О Нас, Как добраться и тд - база данных или прямо html кодом статично.
    Ответ написан
    Комментировать
  • Как вставить данные в БД из ajax?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Вы сначала изучите Фреймворк. Сходите в документацию, прежде чем писать такой код. Например, зачем использовать такие конструкции $_POST['pages']; Так же для отладки используется не контроллер, а провайдер. И функции dump. Для симфони, как и для других это всё давно продумано.
    Ответ написан
    2 комментария
  • Что именно означает lazy в настройках SecurityBundle?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Ленивый анонимный режим предотвращает запуск сеанса, если нет необходимости в авторизации (т.е. явной проверке привилегий пользователя). Это важно для обеспечения возможности кэширования запросов (см. HTTP-кэш).

    https://symfony.com/doc/current/security/.html#the...
    Ответ написан
    2 комментария
  • Как избавиться от try-catch в контроллерах?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Смотря для чего вы делаете эти try catch. Это не всегда повторяемость иногда действительно нужна, например, чтобы перебросить своё исключение. Пойти можно разными способами. Но а простой - это вам нужно просто их убрать и сделать Listener или Subscriber, который будет обрабатывать ошибки и отдавать их в нужном формате в api. Если правильно понял для чего нужно. Пример.
    Ответ написан
    1 комментарий
  • Где должен регистрироваться сеанс, когда аноним заходит на сайт?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Не мыслите таблицами - ничего хорошего не выйдет
    2. Хранить можно также в NoSQL, что даже лучше. Например, redis.
    Ответ написан
    1 комментарий
  • Почему date('Y-m-d') возвращает не текущее время?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Настройте время. Скорее всего установлен не верный часовой пояс (UTC)
    Ответ написан
    2 комментария