Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 31f5564

Browse filesBrowse files
committed
Respect parent class contract in ContainerAwareDoctrineEventManager
1 parent e197c9a commit 31f5564
Copy full SHA for 31f5564

File tree

Expand file treeCollapse file tree

2 files changed

+108
-53
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+108
-53
lines changed

‎src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php
+48-43Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class ContainerAwareEventManager extends EventManager
2828
* <event> => <listeners>
2929
*/
3030
private $listeners = [];
31+
3132
private $initialized = [];
33+
3234
private $container;
3335

3436
public function __construct(ContainerInterface $container)
@@ -37,72 +39,61 @@ public function __construct(ContainerInterface $container)
3739
}
3840

3941
/**
40-
* Dispatches an event to all registered listeners.
41-
*
42-
* @param string $eventName The name of the event to dispatch. The name of the event is
43-
* the name of the method that is invoked on listeners.
44-
* @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners.
45-
* If not supplied, the single empty EventArgs instance is used.
46-
*
47-
* @return bool
42+
* {@inheritdoc}
4843
*/
4944
public function dispatchEvent($eventName, EventArgs $eventArgs = null)
5045
{
51-
if (isset($this->listeners[$eventName])) {
52-
$eventArgs = null === $eventArgs ? EventArgs::getEmptyInstance() : $eventArgs;
46+
if (!isset($this->listeners[$eventName])) {
47+
return;
48+
}
5349

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

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-
}
52+
if (!isset($this->initialized[$eventName])) {
53+
$this->initializeListeners($eventName);
54+
}
6055

61-
$listener->$eventName($eventArgs);
62-
}
63-
$this->initialized[$eventName] = true;
56+
foreach ($this->listeners[$eventName] as $hash => $listener) {
57+
$listener->$eventName($eventArgs);
6458
}
6559
}
6660

6761
/**
68-
* Gets the listeners of a specific event or all listeners.
69-
*
70-
* @param string $event The name of the event
71-
*
72-
* @return array The event listeners for the specified event, or all event listeners
62+
* {@inheritdoc}
7363
*/
7464
public function getListeners($event = null)
7565
{
76-
return $event ? $this->listeners[$event] : $this->listeners;
66+
if (null !== $event) {
67+
if (!isset($this->initialized[$event])) {
68+
$this->initializeListeners($event);
69+
}
70+
71+
return $this->listeners[$event];
72+
}
73+
74+
foreach ($this->listeners as $event => $listeners) {
75+
if (!isset($this->initialized[$event])) {
76+
$this->initializeListeners($event);
77+
}
78+
}
79+
80+
return $this->listeners;
7781
}
7882

7983
/**
80-
* Checks whether an event has any registered listeners.
81-
*
82-
* @param string $event
83-
*
84-
* @return bool TRUE if the specified event has any listeners, FALSE otherwise
84+
* {@inheritdoc}
8585
*/
8686
public function hasListeners($event)
8787
{
8888
return isset($this->listeners[$event]) && $this->listeners[$event];
8989
}
9090

9191
/**
92-
* Adds an event listener that listens on the specified events.
93-
*
94-
* @param string|array $events The event(s) to listen on
95-
* @param object|string $listener The listener object
96-
*
97-
* @throws \RuntimeException
92+
* {@inheritdoc}
9893
*/
9994
public function addEventListener($events, $listener)
10095
{
10196
if (\is_string($listener)) {
102-
if ($this->initialized) {
103-
throw new \RuntimeException('Adding lazy-loading listeners after construction is not supported.');
104-
}
105-
10697
$hash = '_service_'.$listener;
10798
} else {
10899
// Picks the hash code related to that listener
@@ -113,14 +104,15 @@ public function addEventListener($events, $listener)
113104
// Overrides listener if a previous one was associated already
114105
// Prevents duplicate listeners on same event (same instance only)
115106
$this->listeners[$event][$hash] = $listener;
107+
108+
if (\is_string($listener)) {
109+
unset($this->initialized[$event]);
110+
}
116111
}
117112
}
118113

119114
/**
120-
* Removes an event listener from the specified events.
121-
*
122-
* @param string|array $events
123-
* @param object|string $listener
115+
* {@inheritdoc}
124116
*/
125117
public function removeEventListener($events, $listener)
126118
{
@@ -138,4 +130,17 @@ public function removeEventListener($events, $listener)
138130
}
139131
}
140132
}
133+
134+
/**
135+
* @param string $eventName
136+
*/
137+
private function initializeListeners($eventName)
138+
{
139+
foreach ($this->listeners[$eventName] as $hash => $listener) {
140+
if (\is_string($listener)) {
141+
$this->listeners[$eventName][$hash] = $this->container->get($listener);
142+
}
143+
}
144+
$this->initialized[$eventName] = true;
145+
}
141146
}

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php
+60-10Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ protected function setUp()
2828

2929
public function testDispatchEvent()
3030
{
31-
$this->container->set('foobar', $listener1 = new MyListener());
32-
$this->evm->addEventListener('foo', 'foobar');
31+
$this->container->set('lazy', $listener1 = new MyListener());
32+
$this->evm->addEventListener('foo', 'lazy');
3333
$this->evm->addEventListener('foo', $listener2 = new MyListener());
3434

3535
$this->evm->dispatchEvent('foo');
@@ -38,19 +38,69 @@ public function testDispatchEvent()
3838
$this->assertTrue($listener2->called);
3939
}
4040

41+
public function testAddEventListenerAfterDispatchEvent()
42+
{
43+
$this->container->set('lazy1', $listener1 = new MyListener());
44+
$this->evm->addEventListener('foo', 'lazy1');
45+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
46+
47+
$this->evm->dispatchEvent('foo');
48+
49+
$this->container->set('lazy2', $listener3 = new MyListener());
50+
$this->evm->addEventListener('foo', 'lazy2');
51+
$this->evm->addEventListener('foo', $listener4 = new MyListener());
52+
53+
$this->evm->dispatchEvent('foo');
54+
55+
$this->assertTrue($listener1->called);
56+
$this->assertTrue($listener2->called);
57+
$this->assertTrue($listener3->called);
58+
$this->assertTrue($listener4->called);
59+
}
60+
61+
public function testGetListenersForEvent()
62+
{
63+
$this->container->set('lazy', $listener1 = new MyListener());
64+
$this->evm->addEventListener('foo', 'lazy');
65+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
66+
67+
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners('foo')));
68+
}
69+
70+
public function testGetListeners()
71+
{
72+
$this->container->set('lazy', $listener1 = new MyListener());
73+
$this->evm->addEventListener('foo', 'lazy');
74+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
75+
76+
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners()['foo']));
77+
}
78+
4179
public function testRemoveEventListener()
4280
{
43-
$this->evm->addEventListener('foo', 'bar');
44-
$this->evm->addEventListener('foo', $listener = new MyListener());
81+
$this->container->set('lazy', $listener1 = new MyListener());
82+
$this->evm->addEventListener('foo', 'lazy');
83+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
84+
85+
$this->evm->removeEventListener('foo', $listener2);
86+
$this->assertSame([$listener1], array_values($this->evm->getListeners('foo')));
4587

46-
$listeners = ['foo' => ['_service_bar' => 'bar', spl_object_hash($listener) => $listener]];
47-
$this->assertSame($listeners, $this->evm->getListeners());
48-
$this->assertSame($listeners['foo'], $this->evm->getListeners('foo'));
88+
$this->evm->removeEventListener('foo', 'lazy');
89+
$this->assertSame([], $this->evm->getListeners('foo'));
90+
}
91+
92+
public function testRemoveEventListenerAfterDispatchEvent()
93+
{
94+
$this->container->set('lazy', $listener1 = new MyListener());
95+
$this->evm->addEventListener('foo', 'lazy');
96+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
97+
98+
$this->evm->dispatchEvent('foo');
4999

50-
$this->evm->removeEventListener('foo', $listener);
51-
$this->assertSame(['_service_bar' => 'bar'], $this->evm->getListeners('foo'));
100+
$this->evm->removeEventListener('foo', $listener2);
101+
$this->assertSame([$listener1], array_values($this->evm->getListeners('foo')));
52102

53-
$this->evm->removeEventListener('foo', 'bar');
103+
$this->evm->removeEventListener('foo', 'lazy');
54104
$this->assertSame([], $this->evm->getListeners('foo'));
55105
}
56106
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.