Эдуард
я уже молчу что изучения логики как в ямеле это все строить это доп время
Михаил
Поэтому я всегда рекомендую лара-программистам оставаться на ларке. Мир симфони жесток и беспощаден (если не знать про 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 - вполне
Nikolay
Но в целом форма уже неактуальный вариант для апи, а вот где надо рендерить 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
Сам persist flush дальше заливает в бд и я возвращаю ответ
#lest
Ддд не про код
Это я понял
Mihail
Вообще я бы попилил service, на отдельные классы /Services/User/UseCases/Add /Services/User/UseCases/Delete Логичный вопрос зачем выносить в класс - легче распределять зависимости для каждого действия
Kirill
и там не сервисы, а фичи
Kirill
которые сервисы
Mihail
и там не сервисы, а фичи
Ну я их тут юзкейсами обозвал, идея разбить логику А сам сервис получается как набор фич
Kirill
ну или юз кейсы, да
Kirill
вроде так даже правильнее
#lest
Вообще я бы попилил service, на отдельные классы /Services/User/UseCases/Add /Services/User/UseCases/Delete Логичный вопрос зачем выносить в класс - легче распределять зависимости для каждого действия
Вы клоните к тому чтобы я внутри напрямую не создал внутри \Actions\User\Add\Service.php а вынес в use cases и принимал этот класс внутри и через него создавал чтобы не делать persist flush?
Kirill
Application\UserCreation\UserCreator.php
Mihail
Kirill
а персист + флуш допустим вполне для апп сервисов
Kirill
это в доменных нельзя
Mihail
Если кратко, 1. Желательно разбирать каждое действие и не создавать один файл Service, а создать под каждое действие класс (UseCase) 2. В самом юзкейсе, должна быть только бизнес лооика логика (без завязок на внешние зависимости, такие как библиотеки, бд и т.п), которая принимает дтошку и обрабатывает 3. Сам юзкейс (так как это сугубо бизнес логика), не должен знать где что и как хранится, поэтому нужен класс прослойка Storage или т.п и уже в этой прослойке у тебя будет работа с бд Если не прав, поправьте, так как ещё сам постигаю
Михаил
Юзкейс это не бизнес логика, а логика приложения. Бизнес логика лежит в доменных сервисах и сущностях
Kirill
и реализует воркфлоу
Kirill
так что это вполне себе бизнес логика
Михаил
так что это вполне себе бизнес логика
Логика приложения, не бизнеса
Nikolay
ну так юзкейс аггрегирует доменные сервисы
В некоторых подходах доменных сервисов вообще не должно быть
kakoi-to-noob
flush в контроллере вызывать или в репозитории
Kirill
и что это за подходы такие, где в домене нет доменной логики?
Nikolay
это почему это?
Потому что в сущности вся логика доменная
Kirill
Потому что в сущности вся логика доменная
не, божественные сущности - это антипаттерн
Михаил
Kirill
это при только когда начинаешь возиться кажется что так надо
Kirill
а потом начинаешь понимать, что чем сложнее всего - тем больше энтитя и больше в ней говна
Kirill
поэтому энтитю стоит всё же воспринимать как аггрегат и чем анемичнее оно тем лучше
Kirill
ессесно с контролем состояния/инваривантов
Mihail
Вообще у меня сущности всегда 'тупые' получаются - геттеры и сеттеры,по большей части, а уже в юзкейсах я описываю бизнес логику через них
Михаил
UC лежит в слое приложения и свободно может дёргать и домен и инфру. Можно через DepInv абстрагировать дёрганье инфры, но это дрочь
Kirill
но так да, это самый оптимальный вариант