bornfree / tactician-doctrine-domain-events
The bridge to provide Domain Events handling with Tactician command bus and Doctrine ORM
Installs: 145 483
Dependents: 1
Suggesters: 0
Security: 0
Stars: 7
Watchers: 4
Forks: 1
Open Issues: 0
Requires
- php: >=5.4
- bornfreee/tactician-domain-events: ^0.3.0
- doctrine/orm: ^2.2
Requires (Dev)
- phpunit/phpunit: ^5.7
README
The bridge to provide Domain Events handling with Tactician command bus and Doctrine ORM
Installation
Install via composer
composer require bornfree/tactician-doctrine-domain-events
Usage
Using the events recorder facilities you can let Doctrine ORM collect domain events and subsequently let the EventDispatcher
handle them.
Make sure that your entities implement the ContainsRecordedMessages
interface. Use the
EventRecorderCapabilities
trait from Tactician Domain Events library to conveniently record events from inside the entity:
use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents; use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities; class Task implements ContainsRecordedMessages { use EventRecorderCapabilities; public function __construct($name) { $this->record(new TaskWasCreated($name)); } }
Then set up the event recorder for Doctrine entities:
use BornFree\TacticianDoctrineDomainEvent\EventListener\CollectsEventsFromEntities; $eventRecorder = new CollectsEventsFromEntities(); $entityManager->getConnection()->getEventManager()->addEventSubscriber($eventRecorder);
Syfmony integration
This listener will be registered automatically with Symfony, see the documentation
The event recorder will loop over all the entities that were involved in the last database transaction and collect their internally recorded events.
After a database transaction was completed successfully these events should be handled by the EventDispatcher
. This is done by
a specialized middleware, which should be added to the command bus before the middleware that is responsible for
handling the transaction.
use League\Tactician\CommandBus; use League\Tactician\Doctrine\ORM\TransactionMiddleware; use namespace BornFree\TacticianDomainEvent\Middleware\ReleaseRecordedEventsMiddleware; // see the previous sections about $eventRecorder and $eventDispatcher $releaseRecordedEventsMiddleware = new ReleaseRecordedEventsMiddleware($eventRecorder, $eventDispatcher); $commandBus = new CommandBus( [ $releaseRecordedEventsMiddleware, // it should be before transaction middleware $transactionMiddleware, $commandHandlerMiddleware ] );
License
Copyright (c) 2017, Maks Rafalko
Under MIT license, read LICENSE file.