Skip to content

Commit a5076ce

Browse files
committed
Respect parent class contract in ContainerAwareDoctrineEventManager
1 parent e197c9a commit a5076ce

File tree

2 files changed

+57
-12
lines changed

2 files changed

+57
-12
lines changed

src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,22 @@ public function __construct(ContainerInterface $container)
4444
* @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners.
4545
* If not supplied, the single empty EventArgs instance is used.
4646
*
47-
* @return bool
47+
* @return void
4848
*/
4949
public function dispatchEvent($eventName, EventArgs $eventArgs = null)
5050
{
51-
if (isset($this->listeners[$eventName])) {
52-
$eventArgs = null === $eventArgs ? EventArgs::getEmptyInstance() : $eventArgs;
51+
if (!isset($this->listeners[$eventName])) {
52+
return;
53+
}
5354

54-
$initialized = isset($this->initialized[$eventName]);
55+
$eventArgs = null === $eventArgs ? EventArgs::getEmptyInstance() : $eventArgs;
5556

56-
foreach ($this->listeners[$eventName] as $hash => $listener) {
57-
if (!$initialized && \is_string($listener)) {
58-
$this->listeners[$eventName][$hash] = $listener = $this->container->get($listener);
59-
}
57+
if (!isset($this->initialized[$eventName])) {
58+
$this->initializeListeners($eventName);
59+
}
6060

61-
$listener->$eventName($eventArgs);
62-
}
63-
$this->initialized[$eventName] = true;
61+
foreach ($this->listeners[$eventName] as $hash => $listener) {
62+
$listener->$eventName($eventArgs);
6463
}
6564
}
6665

@@ -73,7 +72,21 @@ public function dispatchEvent($eventName, EventArgs $eventArgs = null)
7372
*/
7473
public function getListeners($event = null)
7574
{
76-
return $event ? $this->listeners[$event] : $this->listeners;
75+
if (null !== $event) {
76+
if (!isset($this->initialized[$event])) {
77+
$this->initializeListeners($event);
78+
}
79+
80+
return $this->listeners[$event];
81+
}
82+
83+
foreach (array_keys($this->listeners) as $event) {
84+
if (!isset($this->initialized[$event])) {
85+
$this->initializeListeners($event);
86+
}
87+
}
88+
89+
return $this->listeners;
7790
}
7891

7992
/**
@@ -138,4 +151,18 @@ public function removeEventListener($events, $listener)
138151
}
139152
}
140153
}
154+
155+
/**
156+
* @param string $eventName
157+
*/
158+
private function initializeListeners($eventName)
159+
{
160+
foreach ($this->listeners[$eventName] as $hash => $listener) {
161+
if (\is_string($listener)) {
162+
$this->listeners[$eventName][$hash] = $this->container->get($listener);
163+
}
164+
}
165+
166+
$this->initialized[$eventName] = true;
167+
}
141168
}

src/Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,24 @@ public function testDispatchEvent()
3838
$this->assertTrue($listener2->called);
3939
}
4040

41+
public function testGetListenersForEvent()
42+
{
43+
$this->container->set('foobar', $listener1 = new MyListener());
44+
$this->evm->addEventListener('foo', 'foobar');
45+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
46+
47+
$this->assertSame([$listener1, $listener2], $this->evm->getListeners('foo'));
48+
}
49+
50+
public function testGetListeners()
51+
{
52+
$this->container->set('foobar', $listener1 = new MyListener());
53+
$this->evm->addEventListener('foo', 'foobar');
54+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
55+
56+
$this->assertSame(['foo' => [$listener1, $listener2]], $this->evm->getListeners());
57+
}
58+
4159
public function testRemoveEventListener()
4260
{
4361
$this->evm->addEventListener('foo', 'bar');

0 commit comments

Comments
 (0)