Domain Events Implementation
composer require itmedia/domain-events
DomainEvent:
<?phpuseItmedia\DomainEvents\Event\DomainEvent;
class AccountRegistrationEvent implements DomainEvent
{
/** * @var Account */private$account;
publicfunction__construct(Account$account)
{
$this->account = $account;
}
publicfunctiongetName():string
{
return'account_register';
}
// ...
}Entity implement interface DomainEventPublisher :
<?phpuseItmedia\DomainEvents\Publisher\DomainEventPublisher;
useItmedia\DomainEvents\Publisher\DomainEventPublisherTrait;
class Account implements DomainEventPublisher
{
use DomainEventPublisherTrait; // Helper traitpublicstaticfunctionregister($email)
{
$account = newself();
//...$account->pushEvent(newAccountRegistrationEvent($account));
// Checked single event$account->pushSingleEvent(newMyEvent($account));
$account->pushSingleEvent(newMyEvent($account));
return$account;
}
}Translation domain-event to symfony events on Doctrine postFlush() action:
# services.ymlservices:
# Translate domain event to symfony eventsItmedia\DomainEvents\Bridge\SymfonyDomainEventTranslatorDispatcher:
arguments: ['@event_dispatcher', '@logger', '%kernel.debug%']# Handle domain-eventsItmedia\DomainEvents\Bridge\DoctrineDomainEventsHandler:
arguments: ['@Itmedia\DomainEvents\Bridge\SymfonyDomainEventTranslatorDispatcher']tags:
- { name: doctrine.event_listener, event: postFlush }
- { name: doctrine.event_listener, event: preFlush }