Я пытаюсь реализовать простой проект 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 и запускает их.