Доброго времени.
Исторически работаю преимущественно с Laravel. Но Вопрос интересует, скорее, в целом. Без привязки к конкретному фреймворку.
Некоторое время назад решил/возникла необходимость активно юзать DTO.
Полез искать готовые библиотеки.
Сразу обратил внимание на
Data transfer object от Spatie. Вроде как считается дефакто стандартом в проектах на ларке. Плюс многие советовали.
Да, достаточно лёгкая и простая либа. Но.
Мне не нравится что все свойства торчат наружу (публичные). При заполнении объекта через конструктор мы ещё можем контролировать то, что мы туда пихаем, но нам никто не запрещает потом присвоить свойству любое значение. В целом, вопрос решается путём типизации свойств. Более того, можно сделать, чтобы каждое значение свойства представляло собой инстанс соответствующего ValueObject. но всё же...
Сразу небольшое примечание. Я понимаю, что правильная работа с DTO состоит в том, чтобы в одном месте мы заполнили объект значениями, а в другом - прочитали эти значения. И нигде по дороге они не должны/не могут модифицироваться. Если у нас сохраняется вероятность того, что где-то по пути от источника до получателя данные могут неконтролируемо измениться, то что-то идёт не так и у меня большие проблемы. Но параноя отказывается принимать разумную аргументацию.
Дальше. В рамках этой либы есть понятие кастеров и валидаторов.
Кастеры приводят значение к какому-то виду, прежде, чем поместить его в DTO. А валидаторы. Ну, они и в африке валидаторы.
И вроде всё прекрасно, если бы не порядок выполнения. Сначала отрабатывают кастеры, а потом уже валидаторы. Что мне кажется крайне странным.
Например, если нам нужно указать номер порта, очевидно, что мы сначала хотим проверить попадает ли число в разрешённый диапазон, и вообще является ли значение числом. А только потом создать некий ValueObject с этим значением. Но никак не наоборот.
Одним словом, либа не зашла.
И я написал своё решение на основе
Symfony OptionsResolver.
Работает нормально, свои задачи выполняет, вроде норм. Но не оставляет ощущение, что это всё из пушки по воробьям.
В общем, кто что из вас использует для этих целей?
Может есть хорошие готовые решения, которые мне не попадались на глаза.
Или мне просто стоит понизить планку.. Даже не знаю планку чего. Перфекционизма что ли? И просто наслаждаться жизнью?