Слой
Application, как видно из предыдущего поста, содержит классы command (DTO) и command handlers (например use case's или сервисы, в зависимости от подхода).Data Transfer Object (DTO) — должен содержать только значения примитивных типов и не должен содержать поведения.
Зачем нужен 'use case' или 'command handler'?
Он точно знает как нужно обработать определенную команду. Внутри себя именно он ответственный за всю оркестрацию: здесь, в конструкторе происходит подключение всех необходимых объектов доменной области (это могут быть сущности, value objects, репозитории, генераторы данных и т.д.).
Handler использует данные из DTO например для создания сущности или получения данных из репозитория и выполнения некоторых действий по нему. В самом методе описывается та самая бизнесовая логика, которую должно выполнить ваше приложение.
Возьмём пример уже из существующего поста и дополним его. Как видите в новом примере в конструкторе мы подключили все необходимые зависимости, в execute передали контекст (DTO), а внутри метода содержится бизнесовая логика, прямо как в требованиях задачи: проверяем email на уникальность, генерируем токен, сохраняем в базу, шлем его на почту.
В отличие от предыдущего, этот слой отлично поддаётся Unit тестированию.
Что же относится к Domain?
• Entities
• Value objects
• Domain events
• Repository interfaces
• Domain services
• Factories
• ...
Код из этого слоя не должен никак соприкасаться с "реальным миром".
#PHP #middle #layers #source