2017-02-19 24 views
1

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 만있는 솔루션입니까? 솔루션의 수용 가능한 구현은 무엇입니까? 또는, 어떤 점을 놓치고 있습니까? :)

+1

CQRS는 DDD 및 이벤트 소싱에서 가장 잘 작동합니다. 너 그거 해봤 니? –

답변

1

만든 집계/엔티티의 ID에 대한 정보를 얻는 가장 쉬운 방법은 명령에 추가하는 것입니다. 그래서 프론트 엔드는 id를 생성하고 그것을 데이터와 함께 전달합니다. 그러나이 솔루션을 작동 시키려면 일반 데이터베이스 정수 대신 uuid를 사용해야합니다. 그렇지 않으면 db 측에서 식별자를 복제하는 경우가 있습니다.
명령이 비동기이며 시간이 많이 걸리는 작업을 수행하는 경우 소비자의 이벤트를 확실히 게시 할 수 있습니다. 따라서 클라이언트는 via.e.g. 웹 소켓은 실시간으로 정보를 수신합니다. 또는 명령의 ID가있는 주문의 존재 여부에 대해 백엔드에 수시로 문의하고 리소스가있는 경우 올바른 페이지로 리디렉션하십시오.

+0

필자는 어떻게 든 아이디어를 좋아하지 않으며, 뭔가를하고 새로운 엔티티를 생성하기 위해 커맨드를 사용해야하는 서비스는 그 엔티티의 생성 ID를 처리해야합니다. 나의 예에서 보여 주었 듯이, 나는 모든 명령이 GUID로 만들어지기를 좋아한다. 그리고 나는 그것을 얻을 수있다. 그런 다음 나는 이드의 신분을 가지고 있으며 무엇을 듣는 지 안다. 그러나 내 예제에서는 어떻게 구현 될 수 있습니까? 그것은 차단되어야하며, 따라서 활성에 대해 묻지 않습니다. – Tom

+0

웹 소켓 소리가 좋아서, React PHP http : // reactphp를 발견했습니다.org /, 그러나 나는 아직도 나의 예제에 적용하는 방법을 얻지 못한다. 내가 Google에서 검색 할 때 그에 관한 정보는 거의 없습니다. 시간이 좀 걸릴거야. 누군가 대답에 대해 자세히 설명해 준다면 괜찮을까요? :) – Tom

+0

왜이 서비스가 이드 생성에 책임이 있다고 생각합니까? 당신은 어쨌든 사용자에게 노출 시키지만, 사용자가 알아서는 안되는 숨겨진 가치가 아닙니다. – Dariss