Допустимое место для внедрения службы проекции для обработки объектов или событий домена - PullRequest
0 голосов
/ 24 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...