흐름 :PHP의 DDD -> DomainEventPublisher -> subscribe 메소드를 사용할 위치는 어디입니까?
CreateNewTaskRequest -> CreateNewTaskService -> 작업 :: writeFromNew() -> NewTaskWasCreated (도메인 이벤트) -> DomainEventPublisher 전화 가입자에 처리 할 수 있습니다.
위의 흐름에 따라 도메인 이벤트에 대한 구독자를 어디에서 추가합니까?
나는 현재 DDD in PHP 책을 읽고 있는데,이 일을해야 할 곳을 파악할 수 없습니까?
이
는 내가 가지고있는 코드 만public static function writeNewFrom($title)
{
$taskId = new TaskId(1);
$task = new static($taskId, new TaskTitle($title));
DomainEventPublisher::instance()->subscribe(new MyEventSubscriber());
$task->recordApplyAndPublishThat(
new TaskWasCreated($taskId, new TaskTitle($title))
);
return $task;
}
작업이 집계 루트 확장 나에게 잘못 느낌 :
class AggregateRoot
{
private $recordedEvents = [];
protected function recordApplyAndPublishThat(DomainEvent $domainEvent)
{
$this->recordThat($domainEvent);
$this->applyThat($domainEvent);
$this->publishThat($domainEvent);
}
protected function recordThat(DomainEvent $domainEvent)
{
$this->recordedEvents[] = $domainEvent;
}
protected function applyThat(DomainEvent $domainEvent)
{
$modifier = 'apply' . $this->getClassName($domainEvent);
$this->$modifier($domainEvent);
}
protected function publishThat(DomainEvent $domainEvent)
{
DomainEventPublisher::instance()->publish($domainEvent);
}
private function getClassName($class)
{
$class = get_class($class);
$class = explode('\\', $class);
$class = end($class);
return $class;
}
public function recordedEvents()
{
return $this->recordedEvents;
}
public function clearEvents()
{
$this->recordedEvents = [];
}
}
집계를 특정 게시자와 연결하면 안됩니다. 훨씬 더 나은 대안은 이벤트 저장소 나 저장소에서 기록 된 이벤트를 게시하는 것입니다. 또한 DomainEventPublisher 클래스는 스레드로부터 안전하지 않습니다. 거기에는 스레드 로컬 멤버가 있거나 PHP에서 이에 해당하는 멤버가 있어야합니다. 마지막으로 도메인 이벤트를 구독하는 것은 집계가 아닙니다. AR은 이벤트를 게시하며 누가 청취하는지 상관하지 않습니다. 가입자를 다른 곳이나 부트 스트랩 중 응용 프로그램 계층, 특정 명령 처리기, 인프라 스트럭처에 추가 할 수 있습니다. – plalx