GPMASH
GPMASH

Reputation: 91

DDD in PHP -> DomainEventPublisher -> Where to use the subscribe method?

The flow:

CreateNewTaskRequest -> CreateNewTaskService -> Task::writeFromNew() -> NewTaskWasCreated(domain event) -> DomainEventPublisher calls handle on subscribers.

Following the flow above, I'm wondering where do you add subscribers for domain events?

I'm currently reading the book DDD in PHP, but I'm unable to grasp where this should be done?

This is the code I have but feels wrong to me

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;
    }

Task extends Aggregate root:

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

Upvotes: 2

Views: 1102

Answers (1)

Federkun
Federkun

Reputation: 36989

The DomainEventPublisher class is a singleton, and you can add a subscriber with

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

where YourSubscriber implements DomainEventSubscriber.

Upvotes: 1

Related Questions