доменный дизайн — DDD в PHP — & gt; DomainEventPublisher — & gt; Где использовать метод подписки?

Поток:

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 = [];
}
}

1

Решение

DomainEventPublisher класс является одиночным, и вы можете добавить подписчика с помощью

DomainEventPublisher::instance()->subscribe(new YourSubscriber());

где YourSubscriber инвентарь DomainEventSubscriber.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]