Vlad
хотя с другой стороны было бы удобно
The Ant
Kirill
Так работает же
Ну вот у парня выше не работал, а я не тестил с енамами
Vlad
Kirill
я тестил только с дататаймами и обломался, когда в одном месте потребовалось всегда отдавать в UTC метку
Kirill
Но самая большая попаболь, конечно, от конструкторов
Vlad
Vlad
я даже писал свое говнецо под это
Vlad
и serializer чота умеет так,но очень очень плохо
Kirill
Вначале выдернуть ошибки партиал денормализации
Vlad
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"
}
}
]
}
Kirill
Kirill
Там констреинт висит на стринг в поле, а приходит инт. Это типичный контракт
Павел
Kirill
Каждое нарушение контракта/инварианта - это сообщение об ошибке
Павел
Кастыль но работает
Kirill
Павел
Мы либо засетили енам верно, либо неверно
Vlad
Kirill
и плюс два разных исключения для обычного поля DTO и для промоутед поля из конструктора DTO
Vlad
и часто дергуют и спрашивают,а что не так! Я все по документации
Павел
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
The Ant
такие дто только для риспонса, и там сложно засунуть строку в инт поле )
Kirill
десериалайзер умеет и в такое
Kirill
точнее делает вид, что умеет))))
Kirill
потому что там всё на соплях и костылях внутри
The Ant
да вроде нормально работает, я по крайней мере пока факапов не встречал
Kirill
в сериалайзере или десериалайзере?
The Ant
в сериалайзе таких дто в джсон
Kirill
в сериалайзе таких дто в джсон
сериализуй ДТО с двумя DateTime объектами, где один должен быть всегда в формате RFC3339 UTC, а второй с указанной таймзоной
The Ant
чето такое было в доке, указать другой формат для поля принудительно через атрибут
Kirill
Там всего 2 атрибута есть (было по крайней мере в 6.1)
Kirill
один для скипа поля, другой для группировки
Kirill
а форматирование можно выставить только глобально на весь сериалайзер
Vlad
Kirill
Kirill
больше
Vlad
можно повесить контекст на проперти
Kirill
но всё равно нету: https://github.com/symfony/serializer/tree/6.2/Annotation
Kirill
Kirill
а может ты и прав
Kirill
и я в глаза продолбился тогда, когда столкнулся с этим
Vlad
https://github.com/symfony/serializer/blob/6.2/Annotation/Context.php
Kirill
да, вижу
Vlad
c 5.3 появился))
Kirill
не, это я продолбился, забей
Kirill
Хм, есть подозрение, что этим контекстом можно и енамы захардкодить...
Kirill
Осталось им, короче, начать воспринимать тайп-хинты как констреинты валидатора и заполнять ДТО физически только после всех проверок и будет норм
Kirill
ну почти норм...