CQRS를 사용하여 PHP 응용 프로그램을 구현하고 있습니다. 확인동일한 PHP 프로세스에서 비동기 명령 (CQRS)으로 새로 생성 된 엔티티를 검색하는 방법은 무엇입니까?
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
이 내가
$command = new CreateOrderCommand(/** some data**/);
$this->commandBus->handle($command);
을 수행 할 때 CommandBus 지금처럼 쉽게 적절한 CreateOrderCommandHandler
클래스에 명령을 전달한다고 가정 해 봅시다.
그러나 처리 방법은 무효이므로 진행이나 결과에 대해서는 알지 못합니다. 예를 들어 화재 CreateOrderCommand
을 수행하고 같은 프로세스에서 새로 생성 된 엔티티 ID를 획득하려면 어떻게해야합니까?
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;
}
는 일부 구현은 단지 그것의 반환 예를 에코 진전 또는 OrderCreatedEvent
에 할 수 있도록 특정 GUID와 명령에 (내가 너무 일부 이벤트 시스템을 구현해야합니다) 이벤트의 몇 가지 검사를해야한다 그 사건에서 얻을 수있는 ID. 명령을 비동기식으로 처리하는 소비자 프로세스는 예를 들어 토끼와 사용자 클라이언트에게 이벤트를 가져다가 적절한 응답을 보냅니다 (진행 상황을 반향하고 예를 들어 새로 생성 된 엔터티를 반환).
하지만 어떻게 할 수 있습니까? GUID 만있는 솔루션입니까? 솔루션의 수용 가능한 구현은 무엇입니까? 또는, 어떤 점을 놓치고 있습니까? :)
CQRS는 DDD 및 이벤트 소싱에서 가장 잘 작동합니다. 너 그거 해봤 니? –