2016-11-17 11 views
2

저는 현재 DDD in PHP 책에 대한 예측을 읽고 있는데, 나는 언제 어디에서 프로젝터 클래스의 register 메소드를 호출하는지 혼란 스럽습니다.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

찾고있는 것은 pub/sub 패턴입니다. – Dariss

+0

동기 투영입니까? – plalx

+0

@plalx 예 동기화되었습니다. –

답변

1

여러 가지 방법이 있습니다. 그러나 귀하의 Projector 클래스가 스레드로부터 안전하지 않다면, 당신은 어딘가에서 경합이 없어야합니다. 내 응용 프로그램의 Composition Root에서 직접 또는 간접적으로 응용 프로그램 시작 후크를 활용하여 수행 할 것입니다.

또한 Projectorregister 기능을 악용하는 위험을 최소화하기 위해 Projector 클래스를 구성 할 때 모든 예상을 전달할 수 있습니다. 따라서 나중에 register을 호출하는 사람이 계속 project 작업으로 경합을 일으킬 위험이 없습니다.