私は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のソリューションですか?ソリューションの受け入れ可能な実装は何ですか?それとも、どのような点がありますか? :)
CQRSはDDDおよびイベントソーシングに最も適しています。あなたはそれらを試しましたか? –