The Ant
блять... 🤣🤣🤣🤣
Павел
А не однозначный трувэй
Павел
Просто опять же UserInfo может быть не понятным
Павел
А какой нить RegistrationData - уже понятнее
The Ant
Ну я вот так реквест дтошки и называю они как бы и дто, а как бы и не дто... просто контейнер для данных с реквеста
Павел
Опять же старатайтесь зависит от кейса
The Ant
ну дто между слоями катают, я хз. реквест дто между слоями не катается, оно дальше контроллера не едет. Если конечно данные не мапят сразу на входную дто сервиса
The Ant
опять же, дто входная для сервиса... она и не дто получается
The Ant
это что-то типа команды для сервиса выходит
Kirill
1) враппер данных в dto v1 {} -> {data: {}, code: 0} 2) детектор контент тайпа с резолвом фектори: accept: application/json -> json 3) прокидывание всяких доп. данных в респонз 4) + тоже самое для исключений со всякими преобразованиями
Павел
ну у меня несколько листнеров для этого)
Спасибо , Сложна ))) Не, конечно какие то кейсы, если они нужны перекрывают, но для рядового проекта возможно лишнее
Павел
1) враппер данных в dto v1 {} -> {data: {}, code: 0} 2) детектор контент тайпа с резолвом фектори: accept: application/json -> json 3) прокидывание всяких доп. данных в респонз 4) + тоже самое для исключений со всякими преобразованиями
Просто у тебя слой который является http слоем (контроллер), по факту с http не работает ни на входе, ни на выходе. Получается это некий слой прокладка дополнительная.
Kirill
а не хттп контроллером / презентером, как обычно бывает
Павел
ну да, просто у меня контроллер является контроллером
Ну с одной стороны звучит вроде норм, с другой почти ничего не решает. Хз короче.
Kirill
решает удобство и понятность как фигачить апишки)
Kirill
ну и плюс сваггер по такому генерить прям чудо
Павел
решает удобство и понятность как фигачить апишки)
Ну удобно и понятно без этого вполне тоже)
Павел
@SerafimArts Я так понимаю, у тебя этот контроллер апликейшен слой?
Kirill
ага
Kirill
но у меня апп + презентейшн объединены, тупо для упрощения
Павел
ага
Ну тогда звучит интереснее, т.е. по сути это юзкейс на который ты натравил роутер через инфру и аспектное программирование. Но тогда, имхо, аддер тут странная штука, который являет границей бизнес операции
Павел
Или аддер - это и есть апликейшен юзкейс, а контроллер апликейшен над апликейшеном.... Хзкороче)
Kirill
ну таки да
Kirill
только оно в домене
Kirill
типа делаем скидку на то, что тут нихрена не гексагоналка, а её подобие)))
Kirill
и не режем логику на апп юз кейс + доменные сервисы под изолированный кейс, а фигачим всё в домен там, где оно ближе по смыслу
Kirill
ну и понятно что тогда домены пересекаются и друг-друга дёргают
Михаил
Да можно вообще тогда не парится с доменкой, а просто делать изолированные модули в service
Павел
Да так то пофиг на слои и прочее. Я пргосто прикидываю как это было бы например без симфы: httpController->controller->application(но у тебя это домен, тут вопросики ну да ладно). С другой стороны ты в контроллере конкретную вью отдаешь. Т.е. отдачей вью ты просто унифицировал преобразование вью модели в http repsonse от разных заголовков.
Михаил
Фига вы тут понаписали
Kirill
не, контроллером я дто/модель отдаю)
Kirill
а за представление отдельные листнеры отвечают
Михаил
Лето - сезон поиска работ и доморощенные архитекторы вылезли в чаты)?
Павел
Павел
Так то в целом даже логично выходит, отдавая из конотроллера какую то модель простую, можно сделать обертку которая преобразует уже модели в разные форматы.
Михаил
Слушайте, а вот листенеры это конечно удобно. Но хорошо ли? Как избежать того, что когда проект вырастит не ходить и не парится мол "вот я обновлю щас эту сущность, это только триггернёт обновление в бд или ещё какой-нибудь листенер какую-нибудь работу наделает?"
Михаил
Ну вот где эта граница. Где я пишу листенер и понимаю что он будет помогать а не выстреливать в ногу?
Павел
Ну вот где эта граница. Где я пишу листенер и понимаю что он будет помогать а не выстреливать в ногу?
Как и любой код, все меняется со времени, сегодня помогает завтра мешает.
The Ant
Михаил
Ну блин, это максимально беззубые мнения
Михаил
может какой-то гайдлайн есть
Михаил
Не знаю что за коллбеки но просто когда читаешь иногда логику: A -> B -> C а по факту: A -> listener -> listener -> B -> listener -> C -> listener -> listener
R
Для приведения к типам можно рефлексией получить карту свойств Дто и применить ее к входящим данным пред десериализацией
Kirill
А основной флоу построен как раз на этих псевдособытиях, а не вынесен отдельно
Михаил
Для приведения к типам можно рефлексией получить карту свойств Дто и применить ее к входящим данным пред десериализацией
а можно объявить статический метод и пусть внутри него код получит реквест и данные из реквеста сам размапит на дто
Kirill
Хз когда там наконец отделят кернел от хттп кернела, всё жду
Kirill
Свой написать что ли...
Михаил
почему нельзя просто взять и симфу переписать так как в ларке
Михаил
Хз когда там наконец отделят кернел от хттп кернела, всё жду
ой да, особенно когда пишешь свой бандл, а там ради 5 строчек кода приходится http кернел тянуть, хотя сервис вообще не про http
Павел
Не знаю что за коллбеки но просто когда читаешь иногда логику: A -> B -> C а по факту: A -> listener -> listener -> B -> listener -> C -> listener -> listener
Для отслеживания писать трейсИд в логах, только так можно понять что куда улетело и что вызвалось
Павел
У каждой операции есть начало, вот для нее создавать id, а дальше уже его прокидывать везде. Решается через те же процессоры монолога.
Павел
Потому что даже очень долгая связка вполне может быть верной и как раз хорошим решением, чтобы не забыть что то вызвать в логике (если без ивентов). Но когда и почему эта связка вдруг сломалась - никто не угадает, так как меняются требования постоянно
Михаил
Для отслеживания писать трейсИд в логах, только так можно понять что куда улетело и что вызвалось
да дело не в трейсинге. Дело в том что я там думаю что sql запросы только идут, потому что логика понятная а на самом деле вызываются ещё и листенеры которые http запросы шлют
Михаил
ну банальный пример. Я смотрю есть роут регистрации пользака в живом журнале. Внутри него вызывается юзкейс в котором идёт описание логики. 1) размапь контекст на пользака 2) создай для него борд и на этот борд помести первую запись "я зарегистрировался!" 3) сохрани это всё дело Вроде всё просто, больше никаких действий нет, но как оказалось под ковром есть листенер который слушает персист пользователя, берёт его email и отсылает письмо - что недопустимо и грязно. Вот где та граница, что можно писать в листенеры а что нет?
Павел
Был бы ивент в сущности или сервисе, его было бы видно.
Павел
Использовать ивенты доктрины - имхо, грязно и опасно.
Павел
прям максимально исключительный случай
Михаил
хорошо, а кто-то взял и прописал то же событие но не в доктрин ивенты а в terminate кренела? так уже можно?
Павел
хорошо, а кто-то взял и прописал то же событие но не в доктрин ивенты а в terminate кренела? так уже можно?
Ну это инфраструктурные ивенты, их должно быть минимум. Так то можно подписаться на что угодно, на ивент бандла или еще чего.
Павел
Желательно все это делать максимально видимо. Например подписаться на тот же терминейт, если он нужен только для одного роута, можно в самом роуте, а не глобально и например ифы на роут нейм ставить
Павел
А если он глобальный, то он не будет сюрпризом, скорее незнанием инфры проекта. Потому что он вызывается везде
Dmitriy
Не понимаю чем плох глагол для инвока AddUser, в тему про нейминг и "нельзя глаголы"
Павел
Не понимаю чем плох глагол для инвока AddUser, в тему про нейминг и "нельзя глаголы"
Ну видимо пошло от того, что класс все же - это некий объект (предмет) имеющий поведение - методы. Объект - существительное, методы - глаголы. Мы же используем invokable класс как функцию чтобы протащить DI. Т.е. как бы ломаем типичное представление о объекте. Т.е. в целом если бороться с системой именований в ООП и протаскивать ньюансы реализации - то мб почему бы и нет. Если это устраивает команду. С другой стороны, это так или иначе Комманда,Обработчик, Резолвер - т.е. существительное. И просто идет борьба с суффиксами, что вроде тоже верно.
Павел
Идти в разрез с неким устоявишмся и авторететным (книги) всегда некий риск, по оцениванию со стороны
Павел
Если придет человек который следует устоявишся правилам, то покрутит у виска. А если будет существительное хоть и с суффиксом, то потенциальных претензий будет меньше
Павел
Не понимаю чем плох глагол для инвока AddUser, в тему про нейминг и "нельзя глаголы"
Если же говорить про личное предпочтение суффиусов, то при поиске по проекту я ввожу нужное мне именно с суффиксом и поиск идет легче. Т.е. UsCom{mand},UsEv{ent},UsSu{bscriber} что облегчает подстановку нужных классов
Dmitriy
Набираешь AddUser и все находишь без всяких суфиксов
Dmitriy
Просто с invokable классами проще решать проблему нейминга, существительное гораздо сложнее выходит, приходится использовать "ненужные" суфиксы UserRegistrationHandler->handle(), что повышает когнитивную нагрузку )
The Ant
Просто с invokable классами проще решать проблему нейминга, существительное гораздо сложнее выходит, приходится использовать "ненужные" суфиксы UserRegistrationHandler->handle(), что повышает когнитивную нагрузку )
Я вот как раз называю сервис через глаго, например AddUser. И постоянно конфликт имен. Например надо сделать это асинхронно, делаешь команду... AddUser! которую вызывает в юзкейсе AddUser лол. И начинаются приседания с резолвингом в неймспейсах. Почему бы сразу не назвать нормально? А хрен его знает )
Павел
Просто с 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