Я интегрирую Zend Framework и Doctrine 2 и открываю для себя уровень службы.
Теперь я понимаю (я ошибаюсь?), что у меня есть две возможные архитектуры:
- модель, в которой классы содержат логику предметной области, т. е. свойства + геттеры/сеттеры + сложные методы.
- Облегченная модель, в которой классы содержат свойства + геттеры/сеттеры и слой Сервис, содержащий логику предметной области и изменяющий классы модели.
Каковы плюсы/минусы каждого?
Мне кажется странным потерять ООП, поместив доменную логику как внешнюю по отношению к модели, поэтому я не понимаю, зачем использовать сервисный уровень.
Ответ 1 · рейтинг 14 · timdev
Что заставляет вас думать, что ваш сервисный уровень является внешним по отношению к вашей модели? Это не так. Фактически, это центральная часть вашей модели, наряду с сущностями, репозиториями и т. д.
Если вы используете Doctine2, вам понадобится сервисный слой. Одна из причин заключается в том, что вы не хотите, чтобы ваши Entities знали об EntityManager (вредит тестируемости). Другой заключается в том, что вы также не хотите, чтобы ваши контроллеры управляли EM (это не работа контроллеров, чтобы знать о постоянстве).
Обычно я использую архитектуру, в которой сервисный уровень является интерфейсом контроллера к модели. Сервисный уровень предоставляет функции, которые работают с сущностями (принимая их как параметры, возвращая их или и то, и другое). Постоянство сущностей скрыто сервисным уровнем. Либо сервисный класс сам управляет EM и репозиториями, либо делегирует их какому-то другому коду, о существовании которого контроллер никогда не узнает.
Таким образом, сервисный уровень предоставляет API, который контроллеры могут использовать для управления вашими бизнес-данными.