Vlad
хотя с другой стороны было бы удобно
The Ant
енам - это тот же VO
Так работает же
Vlad
Так работает же
так развалится у тебя, если передашь гавно)
Kirill
Так работает же
Ну вот у парня выше не работал, а я не тестил с енамами
Kirill
я тестил только с дататаймами и обломался, когда в одном месте потребовалось всегда отдавать в UTC метку
Kirill
Но самая большая попаболь, конечно, от конструкторов
The Ant
а так да,все ок резолвит
ну пох, оно и должно ломаться елси говно отправили, не?
Kirill
ну пох, оно и должно ломаться елси говно отправили, не?
не, они должны говорить "ты отправил говно в строчке Х"
Vlad
ну пох, оно и должно ломаться елси говно отправили, не?
в идеале же, хотелось бы собирать ошибки все
Vlad
я даже писал свое говнецо под это
Kirill
не, они должны говорить "ты отправил говно в строчке Х"
Там столько костылей надо сверху навернуть, чтоб оно заработало)))
Vlad
и serializer чота умеет так,но очень очень плохо
Kirill
Вначале выдернуть ошибки партиал денормализации
Kirill
потом отрезолвить ошибки с промоутед полями
Kirill
потом отрезолвить с нормальным конструктором
Kirill
потом регулярками распарсить все эти ошибки (разные!), потому что в симфе баг до сих пор (6.2) не поправили и там не передаётся путь к полю в исключении
The Ant
зачем такие навороты на заведомо неверный запрос? это ж рай для дудосеров, так дорого по ресурсам ошибки обрабатывать
The Ant
заворачиваем в трайкетч и "попробуй ка еще"
Vlad
ну информативность для клиента
The Ant
клиенту не нужна такая информативность
Kirill
зачем такие навороты на заведомо неверный запрос? это ж рай для дудосеров, так дорого по ресурсам ошибки обрабатывать
потому что это мастхев для любого апи говорить "логин должен быть строкой, а у вас инт"
Vlad
нужна
Vlad
тебе что приятнее увидеть
Vlad
{ "message": "Вы идиот!" }
Vlad
или
Vlad
{ "type": "Bad request", "title": "Validation Failed", "detail": "incomes: Эта коллекция должна содержать только уникальные элементы.", "violations": [ { "propertyPath": "incomes", "title": "Эта коллекция должна содержать только уникальные элементы.", "type": "urn:uuid:7911c98d-b845-4da0-94b7-a8dac36bc55a", "parameters": { "{{ value }}": "array" } } ] }
The Ant
потому что это мастхев для любого апи говорить "логин должен быть строкой, а у вас инт"
касательно логина, с точки зрения безопасности должна быть всего одна фраза "invalid credentionals, poshol naher"
Kirill
Там констреинт висит на стринг в поле, а приходит инт. Это типичный контракт
Kirill
Каждое нарушение контракта/инварианта - это сообщение об ошибке
Павел
Кастыль но работает
Kirill
The Ant
{ "message": "Вы идиот!" }
{ "message": "Can u read documentation? See: http://linktotocs.com/" }
Павел
Только там 3 разных типа ошибки если что)))
Например? Поидее что только не то значение прилетело
Павел
Мы либо засетили енам верно, либо неверно
Kirill
Например? Поидее что только не то значение прилетело
но иногда оно может в виде партиал денормализейшн внутри валидейшн ошибки висеть
Vlad
это тоже самое) 🤣🤣
вот у меня есть сервисы такие,где нету такого
Kirill
и плюс два разных исключения для обычного поля DTO и для промоутед поля из конструктора DTO
Vlad
и часто дергуют и спрашивают,а что не так! Я все по документации
Павел
Kirill
Констуркторы не юзаем, поэтмоу не сталкивались, но спасибо
Это плохо. Любой объект, даже DTO должны быть самодостаточными во время инициализации
Kirill
т.е. если вызван new X, то это уже полноценный объект, который может принимать участие в бизнес логике
Павел
Kirill
Ну звучит логично, спасибо. Хотя на практике не мешает
Это одно из основных правил проектирования жеж))
Kirill
Ну и инициализировать такие DTO удобно
Kirill
return new TermDTO( term: $term, occurrences: $occurrences, tf: $tf, idf: $idf, tfidf: $tf * $idf, );
Kirill
А со стороны DTO просто прописывается: public function __construct( public readonly string $term, public readonly int $occurrences = 1, public readonly float $tf = 0.0, public readonly float $idf = 0.0, public readonly float $tfidf = 0.0, ) { }
Kirill
Это, кстати, одна из причин, почему я в пет-проектах всегда юзаю graphql, вместо restful. Там и с докой проще намного, и нет этого симфонёвого сериалайзера, а есть свой (например в thecodingmachine/graphqlite пакете), который все кейсы решает. А на выходе можно как тот же restful спроектировать
The Ant
return new TermDTO( term: $term, occurrences: $occurrences, tf: $tf, idf: $idf, tfidf: $tf * $idf, );
Я думал жсон риквест сериалазером разбирают, который через рефлексию мапит?
The Ant
такие дто только для риспонса, и там сложно засунуть строку в инт поле )
Kirill
десериалайзер умеет и в такое
Kirill
точнее делает вид, что умеет))))
Kirill
потому что там всё на соплях и костылях внутри
The Ant
да вроде нормально работает, я по крайней мере пока факапов не встречал
Kirill
в сериалайзере или десериалайзере?
The Ant
в сериалайзе таких дто в джсон
Kirill
в сериалайзе таких дто в джсон
сериализуй ДТО с двумя DateTime объектами, где один должен быть всегда в формате RFC3339 UTC, а второй с указанной таймзоной
The Ant
чето такое было в доке, указать другой формат для поля принудительно через атрибут
Kirill
Там всего 2 атрибута есть (было по крайней мере в 6.1)
Kirill
один для скипа поля, другой для группировки
Kirill
а форматирование можно выставить только глобально на весь сериалайзер
Kirill
больше
Vlad
можно повесить контекст на проперти
Kirill
но всё равно нету: https://github.com/symfony/serializer/tree/6.2/Annotation
Kirill
а может ты и прав
Kirill
и я в глаза продолбился тогда, когда столкнулся с этим
Vlad
https://github.com/symfony/serializer/blob/6.2/Annotation/Context.php
Kirill
да, вижу
Vlad
c 5.3 появился))
Kirill
не, это я продолбился, забей
Kirill
Хм, есть подозрение, что этим контекстом можно и енамы захардкодить...
Kirill
Осталось им, короче, начать воспринимать тайп-хинты как констреинты валидатора и заполнять ДТО физически только после всех проверок и будет норм
Kirill
ну почти норм...