Почему репозиторий не должен возвращать DTO?

Везде пишут, что репозиторий не должен возвращать DTO... Как быть тогда? возвращать объект или массив? Но в него можно добавить что угодно, где угодно. Если у меня изменятся получаемые данные, то репозиторий отдаст сразу вместе с ними, и я даже не замечу этого. DTO же по факту гарантирует, что я получу объект в едином виде, и в дальнейшем вижу что принимаю, и что отдаю.

Использую репозиторий чисто для CRUD действий, чтобы иметь прослойку для eloquent моделей, если вдруг решу их заменить.

Подскажите, что в моем случае лучше сделать?


Ответы (1 шт):

Автор решения: Streletz

DTO - это Data Transfer Object. Т.е. объект, которые используется передачи данных клиенту или наоборот получения данных от него.

Формат передачи этих данных вполне может не соответствовать структуре БД, а чаще всего он и не должен ей соответствовать. Если передавать данные в чистом виде, как они представлены в таблицах/моделях БД, то это далеко не всегда удобно для работы клиента в следствие сложной структуры, наличия лишних (которые данный клиент в рамках данной задачи не обрабатывает) данных, неподходящего представления данных (например нужно сконвертировать формат даты, времени и т.д.).

Кроме того, использование DTO в качестве модели для репозитория приводит к сильной связности в коде вследствие нарушения принципа MVC и как закономерный результат поддержка и развитие такого кода заметно усложняется, а иногда и становится просто невозможной. Например, если у вашего сервиса 2 клиента, каждый из которых требует примерно одни и те же данные, но в разных представлениях и/или с небольшими отличиями. Вы же не будете заводить для каждого из них свою структуру таблиц с одинаковыми данными?..

Да и если ваш протокол единый для всех клиентов. Со временем может возникнуть задача что-то поменять. Что проще поменять, структуру таблиц или простенький алгоритм преобразования модели в DTO?

Поэтому лучше разделить между собой DTO и модели. И репозиторий действительно не должен работать с DTO. Скажу больше. Логика работы с DTO в идеале не должна выходить за пределы "транспортного" слоя (в MVC это контроллеры).

→ Ссылка