Эдуард
я уже молчу что изучения логики как в ямеле это все строить это доп время
Михаил
Поэтому я всегда рекомендую лара-программистам оставаться на ларке.
Мир симфони жесток и беспощаден (если не знать про php конфиги)
Эдуард
Михаил
Я щас не хочу вдумываться, я один раз настроил и забыл
Эдуард
^_^
Kirill
да, причём с отключением сессий
Эдуард
например api/login
Kirill
добавить туда исключение для этого роута
Вадим
вот например надо юзера забанить
Jwt Токен имеет небольшое время жизни, просто не продлевай его. Или заведи блеклист на время жизни токена если очень надо
Эдуард
Эдуард
Эдуард
у меня щас вот так вышло
Эдуард
хотя наверно это внутри меййна должно быть
Эдуард
Unrecognized option "guard" under "security.firewalls.api". Available options are "access_denied_handler", "access_denied_url", "access_token", "context", "custom_authenticators", "entry_point", "form_login", "form_login_ldap", "host", "http_basic", "http_basic_ldap", "json_login", "json_login_ldap", "jwt", "lazy", "login_link", "login_throttling", "logout", "methods", "pattern", "provider", "remember_me", "remote_user", "request_matcher", "required_badges", "security", "stateless", "switch_user", "user_checker", "x509".
Эдуард
вот такую поймал ошибку после добавления протекста атворизацией api
Эдуард
разобрался
Эдуард
уважаемые эксперты, я правильно понял что вся валиадция у нас в entity
Эдуард
ну т.е. по факту в модели
Эдуард
этоже в модель все кладется?
Михаил
Нет. Валидация входящих данных происходит где-то на уровне контроллера.
Проверка бизнес правил - в сущностях и доменных сервисах
Эдуард
ну вот я загуглил доку, там вот как на скрине выше
Эдуард
тоже самое сказал чат jpt
Эдуард
ну понятно что сама валидация в контроллере
Эдуард
но метод валидации
Эдуард
он же в каком то классе создан
Эдуард
и вот вопрос в каком
Эдуард
а в контролере мы просто вызываем готовый метод и пихаем туда данные
Михаил
С formBuilder я почти не работал, не подскажу.
Я делал по другому. У каждого эндпоинта была своя dto запроса. Она исполняла интерфейс, который гарантировал 2 метода . 1 - map request, 2 - get constraints
Перед тем как засунуть эту дто в аргумент контроллера, симфа вызывала params resolver который сначала вызывал 2 метод и валилировал данные, а потом мапил запрос при помощи первого метода.
Как итог - контроллер получает правильную, собранную дто запроса.
Сама валидация шла так
https://symfony.com/doc/current/validation/raw_values.html
Михаил
Как остальной мир валидирует, хз
Павел
этоже в модель все кладется?
По разному. Опять же это формы. Форма может использоваться для валидации. И это не обязательно сущность должна передаваться в неё.
Правила можно класть как в форму, так и в сам объект через атрибуты над пропертями.
Плюсы класть контсрейнты в форму - она вроде как валидирует не объект, а именно массив данных, который ей передали. А уже потом мапит на объект, а не наоборот, как mapPayload
Павел
Но в целом форма уже неактуальный вариант для апи, а вот где надо рендерить html - вполне
Павел
Павел
#lest
С formBuilder я почти не работал, не подскажу.
Я делал по другому. У каждого эндпоинта была своя dto запроса. Она исполняла интерфейс, который гарантировал 2 метода . 1 - map request, 2 - get constraints
Перед тем как засунуть эту дто в аргумент контроллера, симфа вызывала params resolver который сначала вызывал 2 метод и валилировал данные, а потом мапил запрос при помощи первого метода.
Как итог - контроллер получает правильную, собранную дто запроса.
Сама валидация шла так
https://symfony.com/doc/current/validation/raw_values.html
У меня также но своеобразно, у меня вместо симфони slimphp у меня вместо контроллеров экшены на каждое действие, Actions\User\Add, Action\User\Delete внутри каждого такого экшена есть RequestDTO.php, Validator.php (валидирует и собирает dto), Service.php (использует дто из параметра), Action.php (передает сухие данные на валидатор и получает дто, дальше передает дто на сервис)
#lest
Как считаете нормальный вариант или нет
#lest
Всякие общие сервисы вынесены в глобальную папку Services и берутся через конструктор посредством DI по интерфейсу
#lest
По итогу валидация у меня у каждого экшена где передаются данные
#lest
Я хотел подучить ddd, даже купил книжку прочитал одну главу и она все еще лежит), надо снова попробовать начать, а так для не больших проектах думаю обходиться без ддд
Mihail
Как считаете нормальный вариант или нет
Да в целом ок, главное чтобы логика работы с пользователем не была завязана в контроллере
Так как само действие не должно знать, как и где вызывается
Ну и внутри самого действия должна быть описана только бизнес логика
Если не прав, поправьте)
#lest
#lest
Сам persist flush дальше заливает в бд и я возвращаю ответ
Nikolay
#lest
Mihail
Вообще я бы попилил service, на отдельные классы
/Services/User/UseCases/Add
/Services/User/UseCases/Delete
Логичный вопрос зачем выносить в класс - легче распределять зависимости для каждого действия
Kirill
Kirill
и там не сервисы, а фичи
Kirill
которые сервисы
Mihail
и там не сервисы, а фичи
Ну я их тут юзкейсами обозвал, идея разбить логику
А сам сервис получается как набор фич
Kirill
ну или юз кейсы, да
Kirill
вроде так даже правильнее
#lest
Kirill
Application\UserCreation\UserCreator.php
Mihail
Kirill
а персист + флуш допустим вполне для апп сервисов
Kirill
это в доменных нельзя
Mihail
Если кратко,
1. Желательно разбирать каждое действие и не создавать один файл Service, а создать под каждое действие класс (UseCase)
2. В самом юзкейсе, должна быть только бизнес лооика логика (без завязок на внешние зависимости, такие как библиотеки, бд и т.п), которая принимает дтошку и обрабатывает
3. Сам юзкейс (так как это сугубо бизнес логика), не должен знать где что и как хранится, поэтому нужен класс прослойка Storage или т.п и уже в этой прослойке у тебя будет работа с бд
Если не прав, поправьте, так как ещё сам постигаю
Михаил
Юзкейс это не бизнес логика, а логика приложения.
Бизнес логика лежит в доменных сервисах и сущностях
Kirill
Kirill
и реализует воркфлоу
Kirill
так что это вполне себе бизнес логика
Михаил
Kirill
kakoi-to-noob
flush в контроллере вызывать или в репозитории
Kirill
и что это за подходы такие, где в домене нет доменной логики?
Михаил
Kirill
это при только когда начинаешь возиться кажется что так надо
Kirill
а потом начинаешь понимать, что чем сложнее всего - тем больше энтитя и больше в ней говна
Nikolay
Kirill
поэтому энтитю стоит всё же воспринимать как аггрегат и чем анемичнее оно тем лучше
Kirill
ессесно с контролем состояния/инваривантов
Kirill
Mihail
Вообще у меня сущности всегда 'тупые' получаются - геттеры и сеттеры,по большей части, а уже в юзкейсах я описываю бизнес логику через них
Михаил
UC лежит в слое приложения и свободно может дёргать и домен и инфру.
Можно через DepInv абстрагировать дёрганье инфры, но это дрочь
Kirill
Kirill
но так да, это самый оптимальный вариант