Я пытаюсь реализовать простой проект CQRS + ES, чтобы понять, как он должен работать. Библиотека Prooph слишком сложна и имеет слишком много опций.
Пока я понимаю, у меня должен быть CommandBus, который будет обрабатывать команды и выполнять логику домена. Я ввел мессенджер Symfony в контроллер, и он работает. Таким образом, совокупный корень создает событие и применяет его к модели предметной области. Затем обработчик команд имеет встроенный репозиторий, который сохраняет домен (сохраняет события домена). Но я не могу получить, как я должен обновить прогноз для этого домена.
Вот как выглядит обработчик команд
class CreateBudgetHandler
{
private $budgetRepository;
public function __construct(
BudgetRepository $budgetRepository
) {
$this->budgetRepository = $budgetRepository;
}
public function __invoke(
CreateBudgetCommand $command
) {
$budget = Budget::create(
new BudgetId(Uuid::uuid4()),
new Amount($command->getBudget()->getAmount()),
\DateTimeImmutable::createFromFormat('Y-m-d', $command->getBudget()->getStartDate()),
\DateTimeImmutable::createFromFormat('Y-m-d', $command->getBudget()->getEndDate())
);
$this->budgetRepository->save($budget);
}
}
Итак, он просто получает команду, вызывает именованный конструктор для модели предметной области (Budget::create
) и передает его в хранилище, которое извлечет все записанные события и сохранит их в базе данных хранилища событий.
Мне интересно, это нормально, чтобы добавить другой репозиторий в обработчик команд, который будет сохранять объект модели домена в другую таблицу? Что-то вроде этого
$this->budgetProject->insert($budget);
insert
Метод берет модель предметной области, читает записанные события, преобразует их в запросы INSERT / UPDATE / DELETE и запускает их.
Задача ещё не решена.
Других решений пока нет …