2016-11-17 18 views
2

私は現在、書籍0​​からの予測について読んでおり、プロジェクタクラスから登録メソッドを呼び出すタイミングと場所を混同しています。DDD in PHP - >プロジェクタ - >プロジェクタの登録方法はいつどこで呼び出されるべきですか?

フロー: CreateNewTaskRequest - > CreateNewTaskService - > Task :: writeFromNew() - > PDOTaskRepository。

PDOTaskRepositoryの保存メソッドの最後に、プロジェクターのプロジェクトメソッドが呼び出され、指定されたドメインイベントをリッスンしているすべての登録された投影のプロジェクトメソッドが呼び出されます。

しかし、どこにプロジェクタをプロジェクタに登録しますか?

class PDOTaskRepository implements TaskRepository 
{ 
    private $projector; 

    public function __construct(Projector $projector) 
    { 
     $this->projector = $projector; 
    } 

    public function save(Task $task) 
    { 
     // Code to save in DB 


     $this->projector->project($task->recordedEvents()); 
    } 
} 


class Projector 
{ 
    /** 
    * @var Projection[] 
    */ 
    private $projections = []; 


    /** 
    * @param Projection[] $projections 
    */ 
    public function register(array $projections) 
    { 
     foreach ($projections as $projection) { 
      $this->projections[$projection->listensTo()] = $projection; 
     } 
    } 

    public function project(array $events) 
    { 
     foreach ($events as $event) { 
      if (isset($this->projections[get_class($event)])) { 
       $this->projections[get_class($event)]->project($event); 
      } 
     } 
    } 
} 
+0

あなたが探しているものは、パブ/サブパターンです。 – Dariss

+0

これらの同期投影法はありますか? – plalx

+0

@plalxはいそれは同期的です –

答えて

1

これを行うにはさまざまな方法があります。しかし、あなたのProjectorクラスはスレッドセーフではないので、競合がないどこかでそれを行う必要があります。私は自分のアプリケーションのComposition Rootの中で、もしあれば、アプリケーション開始フックを利用して直接的または間接的にそれを行うでしょう。

また、Projectorregister機能を悪用するリスクを最小限に抑えるため、Projectorクラスを構築する際には、すべての予測を渡すだけです。これにより、誰かが後でregisterと呼んで、進行中のproject操作で競合を起こす可能性を排除します。