Началось все с одновременной работы с API (magento 2) и БД. Те сущности которые не связаны, относительно легко управлялись через простые модели, но ад начался где есть смешение. Например, есть заказы из API и платежи из БД. Это и подтолкнуло на путь DDD.
По незнанию столкнулся с несколькими проблемами:Сделал несколько слоев. В целом, решил использовать свой упрощенный вариант DDD:
API - ApiClient - ApiEntity - Repository (Entity) - Service - Controller
MySQL - Model - Repository (Entity) - Service - Controller
Пример выбрки: контроллер UserController запрашивает команду getAll() в сервисе UserService который запрашивает пользователей в UserRepository ожидая что ему вернут \EntityInterface User[] (решил что Entity будут моделями Yii потому что так проще, хотя и не по канонам). После получения Entities контроллер может их отобразить.
Пример добавления: контроллер UserController загружает данные в UserEntity и валидирует. После отправляет их в сервис который отправляет их в репозиторий который их добавляет.
- Во-первых, оказывается, очень нужна какая-то "спецификация". Ведь у разных источников разные способы фильтрации и нельзя за репозиторием знать их реализацию. У yii есть простая реализация в Query; у Symofony все очень грамотно, но сложно; другие библиотеки по типу rulez сложны и не очень подходят. По сути нужно простое findBy(['a' => 'b']) или $criteria->where('a = b')->orWhere('a = c')->andWhere('d = e'). Другое дело это все потом переводить в формат для источника.
Пока что репозиторий содержит функцию гидратора и это тоже мешает сделать фильтрацию: я бы хотел фильтровать по "полям" которые могут быть в другом формате. Получается, гидратор нужен и тут для конвертации. - Во-вторых, тоже внезапно оказалось что неправильно будет если хранить объекты как-попало. Рано или поздно получится что в памяти будут 2 заказа или пользователя с разными данными, но по сути это будет один и тот же пользователь. Для этого придумали aggregate root. Только как это реализовать не очень понятно.
Использую yiitech/embedded для загрузки вложенных объектов и работы с ними. Проблема в том что он создает новые объекты которые не будут связаны с моим потенциальным aggregate root.
Только реализация всего напоминает написание своего фреймворка и yii тут не сильно помогает, а иногда и мешает. "Чем дальше в лес - тем толще партизаны" - чем больше реализовываю тем больше нерешенных вопросов.
Хочу узнать, нормальная ли такая облегченная реализация DDD и есть ли какие-то несложные реализации аграгации и спецификации?