The Ant
блять... 🤣🤣🤣🤣
Павел
Павел
А не однозначный трувэй
Павел
Просто опять же UserInfo может быть не понятным
Павел
А какой нить RegistrationData - уже понятнее
The Ant
Ну я вот так реквест дтошки и называю
они как бы и дто, а как бы и не дто... просто контейнер для данных с реквеста
Павел
Опять же старатайтесь зависит от кейса
The Ant
ну дто между слоями катают, я хз. реквест дто между слоями не катается, оно дальше контроллера не едет. Если конечно данные не мапят сразу на входную дто сервиса
The Ant
опять же, дто входная для сервиса... она и не дто получается
The Ant
это что-то типа команды для сервиса выходит
Kirill
Kirill
1) враппер данных в dto v1 {} -> {data: {}, code: 0}
2) детектор контент тайпа с резолвом фектори: accept: application/json -> json
3) прокидывание всяких доп. данных в респонз
4) + тоже самое для исключений со всякими преобразованиями
Павел
Kirill
Kirill
а не хттп контроллером / презентером, как обычно бывает
Kirill
решает удобство и понятность как фигачить апишки)
Kirill
ну и плюс сваггер по такому генерить прям чудо
Павел
Павел
@SerafimArts Я так понимаю, у тебя этот контроллер апликейшен слой?
Kirill
ага
Kirill
но у меня апп + презентейшн объединены, тупо для упрощения
Павел
ага
Ну тогда звучит интереснее, т.е. по сути это юзкейс на который ты натравил роутер через инфру и аспектное программирование.
Но тогда, имхо, аддер тут странная штука, который являет границей бизнес операции
Павел
Или аддер - это и есть апликейшен юзкейс, а контроллер апликейшен над апликейшеном.... Хзкороче)
Kirill
ну таки да
Kirill
только оно в домене
Kirill
типа делаем скидку на то, что тут нихрена не гексагоналка, а её подобие)))
Kirill
и не режем логику на апп юз кейс + доменные сервисы под изолированный кейс, а фигачим всё в домен там, где оно ближе по смыслу
Kirill
ну и понятно что тогда домены пересекаются и друг-друга дёргают
Михаил
Да можно вообще тогда не парится с доменкой, а просто делать изолированные модули в service
Павел
Да так то пофиг на слои и прочее. Я пргосто прикидываю как это было бы например без симфы:
httpController->controller->application(но у тебя это домен, тут вопросики ну да ладно).
С другой стороны ты в контроллере конкретную вью отдаешь.
Т.е. отдачей вью ты просто унифицировал преобразование вью модели в http repsonse от разных заголовков.
Kirill
Михаил
Фига вы тут понаписали
Kirill
не, контроллером я дто/модель отдаю)
Kirill
а за представление отдельные листнеры отвечают
Михаил
Лето - сезон поиска работ и доморощенные архитекторы вылезли в чаты)?
Павел
Павел
Так то в целом даже логично выходит, отдавая из конотроллера какую то модель простую, можно сделать обертку которая преобразует уже модели в разные форматы.
Михаил
Слушайте, а вот листенеры это конечно удобно. Но хорошо ли?
Как избежать того, что когда проект вырастит не ходить и не парится мол "вот я обновлю щас эту сущность, это только триггернёт обновление в бд или ещё какой-нибудь листенер какую-нибудь работу наделает?"
Павел
Михаил
Ну вот где эта граница. Где я пишу листенер и понимаю что он будет помогать а не выстреливать в ногу?
Павел
The Ant
Михаил
Ну блин, это максимально беззубые мнения
Михаил
может какой-то гайдлайн есть
Михаил
Не знаю что за коллбеки но просто когда читаешь иногда логику:
A -> B -> C
а по факту:
A -> listener -> listener -> B -> listener -> C -> listener -> listener
R
Для приведения к типам можно рефлексией получить карту свойств Дто и применить ее к входящим данным пред десериализацией
Kirill
Kirill
А основной флоу построен как раз на этих псевдособытиях, а не вынесен отдельно
Михаил
Михаил
Kirill
Хз когда там наконец отделят кернел от хттп кернела, всё жду
Kirill
Свой написать что ли...
Михаил
почему нельзя просто взять и симфу переписать так как в ларке
Kirill
Павел
Павел
У каждой операции есть начало, вот для нее создавать id, а дальше уже его прокидывать везде. Решается через те же процессоры монолога.
Павел
Потому что даже очень долгая связка вполне может быть верной и как раз хорошим решением, чтобы не забыть что то вызвать в логике (если без ивентов).
Но когда и почему эта связка вдруг сломалась - никто не угадает, так как меняются требования постоянно
Михаил
ну банальный пример. Я смотрю есть роут регистрации пользака в живом журнале.
Внутри него вызывается юзкейс в котором идёт описание логики.
1) размапь контекст на пользака
2) создай для него борд и на этот борд помести первую запись "я зарегистрировался!"
3) сохрани это всё дело
Вроде всё просто, больше никаких действий нет, но как оказалось под ковром есть листенер который слушает персист пользователя, берёт его email и отсылает письмо - что недопустимо и грязно.
Вот где та граница, что можно писать в листенеры а что нет?
Павел
Павел
Был бы ивент в сущности или сервисе, его было бы видно.
Павел
Использовать ивенты доктрины - имхо, грязно и опасно.
Павел
прям максимально исключительный случай
Михаил
хорошо, а кто-то взял и прописал то же событие но не в доктрин ивенты а в terminate кренела? так уже можно?
Павел
Желательно все это делать максимально видимо.
Например подписаться на тот же терминейт, если он нужен только для одного роута, можно в самом роуте, а не глобально и например ифы на роут нейм ставить
Павел
А если он глобальный, то он не будет сюрпризом, скорее незнанием инфры проекта. Потому что он вызывается везде
Dmitriy
Не понимаю чем плох глагол для инвока AddUser, в тему про нейминг и "нельзя глаголы"
Павел
Не понимаю чем плох глагол для инвока AddUser, в тему про нейминг и "нельзя глаголы"
Ну видимо пошло от того, что класс все же - это некий объект (предмет) имеющий поведение - методы. Объект - существительное, методы - глаголы.
Мы же используем invokable класс как функцию чтобы протащить DI. Т.е. как бы ломаем типичное представление о объекте.
Т.е. в целом если бороться с системой именований в ООП и протаскивать ньюансы реализации - то мб почему бы и нет. Если это устраивает команду.
С другой стороны, это так или иначе Комманда,Обработчик, Резолвер - т.е. существительное. И просто идет борьба с суффиксами, что вроде тоже верно.
Павел
Идти в разрез с неким устоявишмся и авторететным (книги) всегда некий риск, по оцениванию со стороны
Павел
Если придет человек который следует устоявишся правилам, то покрутит у виска.
А если будет существительное хоть и с суффиксом, то потенциальных претензий будет меньше
Dmitriy
Набираешь AddUser и все находишь без всяких суфиксов
Dmitriy
Просто с invokable классами проще решать проблему нейминга, существительное гораздо сложнее выходит,
приходится использовать "ненужные" суфиксы UserRegistrationHandler->handle(), что повышает когнитивную нагрузку )
Павел
Просто с invokable классами проще решать проблему нейминга, существительное гораздо сложнее выходит,
приходится использовать "ненужные" суфиксы UserRegistrationHandler->handle(), что повышает когнитивную нагрузку )
Я не вижу тут нагрузки. Вижу как раз нагрузку в обратном и муравей как раз описал выше. Когда есть addUser{UseCase}, addUser{handler}, addUser{message},addUser{messageHandler}, addUser{DomainService}
Да, иногда просто лень писать длинное, поэтому есть ещё такой стиль
AddUser/Handler, AddUser/Command.
#lest
Мне нужно запустить cli команду от интерфейса Console\Command внутри сервиса, вызвать через exec или получить через di команду и вызвать функцию execute с передачей input и output