Как реализовать модель предметной области без анемии c с Doctrine? - PullRequest
0 голосов
/ 28 мая 2020

Я исследую проблему, хорошо описанную здесь .

Допустим, у меня есть эта модель anemi c (ничего не проверяет, просто DAO):

interface User {
  public function setEmail(string $value): void;
  public function getEmail(): string;
}

Давайте реорганизуем его на не-anemi c:

interface User {
  public function getEmail(): string;

  /**
   * @throws UserEmailInvalidException
   */
  public function updateContactInfo(string $email): void;
}

User::updateContactInfo теперь отвечает за проверку электронной почты (например, ни один другой пользователь не зарегистрирован с этим адресом электронной почты).

Поскольку интерфейс реализован как Doctrine Entity (или Document для ODM), он не знает об уровне обслуживания и не может получить доступ к UserRepository для проверки дубликатов.

Моя идея - переместить logi c на уровне обслуживания (мы все еще считаем, что некоторые службы принадлежат модели предметной области). Итак, реорганизованное решение:

interface User {
  public function getEmail(): string;
}

interface UpdateUserContactInfo {
  /**
   * @throws UserEmailInvalidException
   */
  public function execute(User $user, string $email): void;
}

Подходит ли такое решение с точки зрения антипаттернов моделей DDD и Anemi c? Верно ли предположение, что услуги могут быть частью модели предметной области? Я что-то упускаю?

Примечание: на самом деле мы действительно сохраняем в основном только интерфейсы в модели предметной области, поскольку реализация выполняется на уровне инфраструктуры.

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