2017-02-19 5 views
1

私はCQRSでPHPアプリケーションを実装しています。 OK同じ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クラスにコマンドを渡しましょう。

しかし、処理は無効な方法なので、進捗状況や結果についてはわかりません。例えばを呼び出すことができるようにするために何ができるのですか?同じプロセスで新しく作成されたエンティティ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; 
} 

SOME実装だけだそれを返す例えばエコー進行またはOrderCreatedEventにできるようにするには、特定のGUIDを使用してコマンドに(私はあまりにもいくつかのイベントシステムを実装する必要がある)イベントのいくつかのチェックを行う必要があります私はそのイベントから得られるIDです。コマンドを非同期に処理するコンシューマプロセスは、例えば、ウサギとユーザークライアントにイベントを送り、適切な応答を行います(エコーの進行、新しく作成されたエンティティの返送など)。

しかし、それを行う方法は?そして、唯一のGUIDのソリューションですか?ソリューションの受け入れ可能な実装は何ですか?それとも、どのような点がありますか? :)

+1

CQRSはDDDおよびイベントソーシングに最も適しています。あなたはそれらを試しましたか? –

答えて

1

作成した集約/エンティティのIDに関する情報を取得する最も簡単な方法は、コマンドに追加することです。したがって、フロントエンドはidを生成し、それをデータとともに渡します。しかし、このソリューションを機能させるには、通常のデータベースの代わりにuuidを使用する必要があります。そうしないと、db側で識別子を複製することになります。
コマンドが非同期であり、時間のかかる操作を実行する場合、コンシューマからのイベントを確実にパブリッシュできます。したがって、クライアントはvia.e.g.ウェブソケットは情報をリアルタイムで受信します。 また、バックエンドに、コマンドからのIDを持つ注文の存在について、時折、そしてリソースが存在するときに、正しいページにリダイレクトするように依頼してください。

+0

私はどういうわけか、アイデアが気に入らず、何かをして、新しいエンティティを作成するためにコマンドを使用する必要があるサービスは、そのエンティティのIDを生成することに注意する必要があります。私が私の例で示したように、私はむしろすべてのコマンドがGUIDで作成され、それからそれを得ることができるのが好きです。それから私は指揮官のIDを持っており、何を聞くべきかを知っています。しかし私の例では、どのように正確に実装されていますか?それはブロックされている必要がありますので、アクティブについては存在を尋ねません。 – Tom

+0

Websocketがうまく聞こえる、私はReact PHP http:// reactphpを見つけた。org /、しかし私はまだ私の例に適用する方法を取得しません。私がgoogleで検索するとき、それについてはほとんどありません。それは時間がかかるでしょう。誰かが答えでそれを詳述できるならば大丈夫でしょう。 :) – Tom

+0

なぜあなたはそのサービスがIDを生成する責任を負うべきだと思いますか?あなたはそれをユーザに公開しますが、それはユーザが気にしてはいけない隠された価値ではありません。 – Dariss

関連する問題