Поток:
CreateNewTaskRequest -> CreateNewTaskService -> Task :: writeFromNew () -> NewTaskWasCreated (domain domain) -> Обработка вызовов DomainEventPublisher для подписчиков.
Следуя вышеприведенному потоку, мне интересно, куда вы добавляете подписчиков на доменные события?
Я сейчас читаю книгу DDD в 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 класс является одиночным, и вы можете добавить подписчика с помощью
DomainEventPublisher::instance()->subscribe(new YourSubscriber());
где YourSubscriber
инвентарь DomainEventSubscriber
.
Других решений пока нет …