Я реализую приложение PHP с CQRS.Как получить вновь созданный объект с помощью асинхронной команды (CQRS) в том же процессе php?
Скажем, у меня есть CreateOrderCommand
и когда я
$command = new CreateOrderCommand(/** some data**/);
$this->commandBus->handle($command);
CommandBus теперь просто передать команду к правильному CreateOrderCommandHandler
классу так же легко, как:
abstract class SimpleCommandBus implements CommandBus
{
/** @var ICommandHandlerLocator */
protected $locator;
/**
* Executes command
*
* @param Command $command
*/
public function handle(Command $command)
{
$handler = $this->locator->getCommandHandler($command);
$handler->handle($command);
}
}
Все ок.
Но обработка недействительна, поэтому я ничего не знаю о прогрессе или результате. Что я могу сделать, чтобы иметь возможность, например, пожар CreateOrderCommand
, а затем в том же процессе получить вновь созданный идентификатор объекта (возможно, с некоторым пассивным ожиданием его создания)?
public function createNewOrder(/** some data**/){
$command = new CreateOrderCommand(/** some data**/);
$this->commandBus->handle($command);
// something that will wait until command is done
$createdOrder = // some magic that retrieves some adress to result data
return $createdOrder;
}
И сблизиться, что CQRS может обеспечить, команды шина должна быть в состоянии иметь RabbitMqCommandBus
реализацию, только сериализующую команды и отправляет его в очередь кролика.
Таким образом, процесс, который, наконец, обрабатывает команду, может быть некоторым бегущим потребителем, и здесь требуется какая-то связь между процессами - чтобы как-то сообщить об этом пользовательскому процессу от потребителя, что это делается (с некоторой информацией, например id нового объекта).
Я знаю, что есть решение с GUID - я могу отметить команду с GUID. Но тогда что:
public function createNewOrder(/** some data**/){
$command = new CreateOrderCommand(/** some data**/);
$this->commandBus->handle($command);
$guid = $command->getGuid();
// SOME IMPLEMENTATION
return $createdOrder;
}
НЕКОТОРАЯ РЕАЛИЗАЦИЯ должен сделать некоторые проверки событий (так мне нужно реализовать некоторую систему событий тоже) по команде с конкретным GUID, чтобы иметь возможность, например, эхо прогресса или OrderCreatedEvent
просто вернуть его ID, который я получаю от этого события. Потребительский процесс, который асинхронно обрабатывает команду, может, например, передавать события кролику, а пользовательский клиент будет брать их и делать правильный ответ (эхо-прогресс, возвращать вновь созданный объект, например).
Но как это сделать? И решение с GUID является единственным? Каковы приемлемые варианты решений? Или, какой момент мне не хватает? :)
CQRS лучше всего работает с DDD и Event Sourcing. Вы пробовали их? –