Прочитал много статей, где люди говорят, что я должен вернуть модель домена ... Но тогда это разрушит всю идею моего репозитория.

Я использую laravel Eloquent Models (это, если я прав, модели домена). У меня есть репозиторий, поэтому, если я решу переключиться на Doctrine, я могу просто поменять его местами у поставщика услуг. Но если я верну экземпляр модели предметной области (в данном случае Eloquent Model), это не имеет смысла. Мне нужно вернуть тот же результат из репозитория, и DTO кажется именно тем, что мне нужно ...

Может кто-нибудь объяснить мне, почему я не прав?

1
Paul Wall 14 Апр 2020 в 14:46

1 ответ

Лучший ответ

Что есть что

Прежде всего, я хотел бы дать свое толкование используемых вами терминов.

DTO (объект передачи данных)

  • Обычно это класс PHP с общедоступными свойствами.
  • Только несет ответственность за передачу данных
  • Не проверяет данные
  • Не знает о каких-либо конкретных вещах реализации (например, к какому ORM он привязан)
  • Обычно используется для передачи данных между частями приложения, при этом ни одна из частей не знает о реализации другой.

Доменная модель

  • Обычно это класс PHP с частными свойствами.
  • Должны содержать только действительные данные
  • Подтверждает, что любые изменения приводят к действительному состоянию
  • Не знает о каких-либо конкретных вещах реализации (например, к какому ORM он привязан)

Вместилище

  • Отвечает только за хранение и получение данных
  • Знает о его реализации (например, к какому ORM он привязан)
  • Не несет ответственности за возврат достоверных данных

Что это значит для вашего случая

Ответ действительно зависит от того, насколько чистым вы хотите мыслить с точки зрения разделения ответственности.

Если вы разговариваете с пуристами, они скажут, что модели Eloquent не являются DTO и не являются моделями предметной области. Репозиторий вернет красноречивую модель, которая будет сопоставлена ​​с моделью предметной области. Затем эту модель предметной области можно изменить или преобразовать в DTO, который можно использовать для чтения данных. В этом случае обязанности разделены за счет большего количества кода.

Если вы разговариваете с прагматиками, они скажут, что модели Eloquent - это DTO и модели предметной области (а иногда даже репозитории). Поскольку красноречивые модели отвечают за хранение данных, извлечение данных, изменение данных и передачу этих данных в другие части приложения.

В конце концов, все дело в предпочтениях. Вы можете идти чисто, вы можете идти прагматично, вы даже можете выбрать что-то среднее. Это полностью зависит от того, насколько вы продвинутый программист, насколько велик проект, насколько он должен быть обслуживаемым, как быстро нужно вносить изменения и т. Д.

Tdlr

Репозиторий может возвращать DTO или модель предметной области в зависимости от того, насколько чисто вы думаете о разделении ответственности.

6
PtrTon 14 Апр 2020 в 12:49