This repository has been archived by the owner on Sep 23, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 49
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use symfony dispatcher instead of doctrine one
Using doctrine event manager to dispatch domain events prevents domain event listeners to depend on doctrine (circular reference). Plus, it doesn't make much more sense to dispatch domain events through a storage layer dispatcher. This commit allows to dispatch domain events through an event_dispatcher (it uses the symfony event dispatcher by default).
- Loading branch information
Showing
8 changed files
with
141 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
Upgrade from 2.6 to 2.7 | ||
======================= | ||
|
||
Domain Events | ||
------------- | ||
|
||
Doctrine listener does not dispatch domain events through doctrine event manager | ||
anymore. It now does it through a Symfony event dispatcher. The one configured | ||
by default is the `event_dispatcher` service (Yes, it means that you have access | ||
to the whole event dispatcher symfony integration, like the debug toolbar). | ||
|
||
You must change your domain event listeners DIC definition: | ||
|
||
Before: | ||
```yaml | ||
services: | ||
app.sync_listener: | ||
class: App\SyncListener | ||
tags: | ||
- { name: doctrine.event_listener, event: onUserActivated } | ||
``` | ||
After: | ||
```yaml | ||
services: | ||
app.sync_listener: | ||
class: App\SyncListener | ||
tags: | ||
- { name: kernel.event_listener, event: UserActivated } | ||
``` | ||
Delayed event listeners definition must also be updated: | ||
Before: | ||
```yaml | ||
parameters: | ||
knp_rad.domain_event.delayed_event_names: [UserActivated] | ||
|
||
services: | ||
app.async_listener: | ||
class: App\AsyncListener | ||
tags: | ||
- { name: doctrine.event_listener, event: onDelayedUserActivated } | ||
``` | ||
After: | ||
```yaml | ||
parameters: | ||
knp_rad.domain_event.delayed_event_names: [UserActivated] | ||
|
||
services: | ||
app.async_listener: | ||
class: App\AsyncListener | ||
tags: | ||
- { name: kernel.event_listener, event: UserActivated, method: onDelayedUserActivated } | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
56 changes: 56 additions & 0 deletions
56
spec/Knp/RadBundle/DomainEvent/Dispatcher/DoctrineSpec.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
<?php | ||
|
||
namespace spec\Knp\RadBundle\DomainEvent\Dispatcher; | ||
|
||
use PhpSpec\ObjectBehavior; | ||
use Prophecy\Argument; | ||
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | ||
use Doctrine\ORM\Event\PostFlushEventArgs; | ||
use Doctrine\ORM\EntityManager; | ||
use Doctrine\ORM\UnitOfWork; | ||
use Knp\RadBundle\DomainEvent\Provider; | ||
use Knp\RadBundle\DomainEvent\Event; | ||
|
||
class DoctrineSpec extends ObjectBehavior | ||
{ | ||
function let(EventDispatcherInterface $dispatcher) | ||
{ | ||
$this->beConstructedWith($dispatcher); | ||
} | ||
|
||
function it_is_a_doctrine_event_subscriber() | ||
{ | ||
$this->shouldBeAnInstanceOf('Doctrine\Common\EventSubscriber'); | ||
} | ||
|
||
function it_subscribes_to_the_postFlush_event() | ||
{ | ||
$this->getSubscribedEvents()->shouldReturn(array('postFlush')); | ||
} | ||
|
||
function it_dispatches_domain_events_after_doctrine_unit_of_work_has_been_flushed( | ||
PostFlushEventArgs $event, | ||
EntityManager $em, | ||
UnitOfWork $uow, | ||
Provider $entity, | ||
Event $event1, | ||
Event $event2, | ||
$dispatcher | ||
) { | ||
$event->getEntityManager()->willReturn($em); | ||
$em->getUnitOfWork()->willReturn($uow); | ||
$uow->getIdentityMap()->willReturn([[ | ||
$entity | ||
]]); | ||
$entity->popEvents()->willReturn([$event1, $event2]); | ||
$event1->getName()->willReturn('EntityCreated'); | ||
$event2->getName()->willReturn('PropertyUpdated'); | ||
|
||
$event1->setSubject($entity)->shouldBeCalled(); | ||
$event2->setSubject($entity)->shouldBeCalled(); | ||
$dispatcher->dispatch('EntityCreated', $event1)->shouldBeCalled(); | ||
$dispatcher->dispatch('PropertyUpdated', $event2)->shouldBeCalled(); | ||
|
||
$this->postFlush($event); | ||
} | ||
} |