Skip to content

Commit

Permalink
Added the ability to add multiple listeners to each event.
Browse files Browse the repository at this point in the history
In 1.0 release each Doctrine event can only have one listener attached to it, but it would be helpful to be able to add many listeners to a single event (the same effect can currently be achieved by adding multiple subscribers). This PR should have no BC break, it checks if the listener passed is just a single class or an array and behaves appropriately.
  • Loading branch information
Max Brokman authored and patrickbrouwers committed Sep 24, 2015
1 parent d74d5c8 commit 28669c0
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
29 changes: 25 additions & 4 deletions src/EntityManagerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,34 @@ protected function registerListeners($settings = [], EntityManagerInterface $man
{
if (isset($settings['events']['listeners'])) {
foreach ($settings['events']['listeners'] as $event => $listener) {
if (!class_exists($listener, false)) {
throw new InvalidArgumentException("Listener {$listener} does not exist");
}
$this->registerListener($event, $listener, $manager);
}
}
}

$manager->getEventManager()->addEventListener($event, new $listener);
/**
* @param string $event
* @param string|string[] $listener
* @param EntityManagerInterface $manager
*/
private function registerListener($event, $listener, EntityManagerInterface $manager)
{
if (is_array($listener)) {

foreach ($listener as $individualListener) {
$this->registerListener($event, $individualListener, $manager);
}

return;
}

if (!class_exists($listener, false)) {
throw new InvalidArgumentException("Listener {$listener} does not exist");
}

$manager->getEventManager()->addEventListener($event, new $listener);


}

/**
Expand Down
27 changes: 27 additions & 0 deletions tests/EntityManagerFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,29 @@ public function test_can_set_listeners()
$this->assertTrue(array_key_exists('name', $manager->getEventManager()->getListeners()));
}

public function test_can_set_multiple_listeners()
{
$this->disableDebugbar();
$this->disableSecondLevelCaching();
$this->disableCustomCacheNamespace();
$this->disableCustomFunctions();
$this->enableLaravelNamingStrategy();

$this->settings['events']['listeners'] = [
'name' => [
ListenerStub::class,
AnotherListenerStub::class
]
];

$manager = $this->factory->create($this->settings);

$this->assertEntityManager($manager);
$this->assertCount(1, $manager->getEventManager()->getListeners());
$this->assertTrue(array_key_exists('name', $manager->getEventManager()->getListeners()));
$this->assertCount(2, $manager->getEventManager()->getListeners('name'));
}

public function test_can_set_subscribers()
{
$this->disableDebugbar();
Expand Down Expand Up @@ -531,6 +554,10 @@ class ListenerStub
{
}

class AnotherListenerStub
{
}

class SubscriberStub implements EventSubscriber
{
/**
Expand Down

0 comments on commit 28669c0

Please sign in to comment.