8000 [FrameworkBundle] ContainerAwareEventDispatcher::removeListener() (cl… · fixe/symfony@f758884 · GitHub
[go: up one dir, main page]

Skip to content

Commit f758884

Browse files
committed
[FrameworkBundle] ContainerAwareEventDispatcher::removeListener() (closes symfony#3115)
1 parent ffce6be commit f758884

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

src/Symfony/Bundle/FrameworkBundle/ContainerAwareEventDispatcher.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,33 @@ public function addListenerService($eventName, $callback, $priority = 0)
7171
$this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority);
7272
}
7373

74+
public function removeListener($eventName, $listener)
75+
{
76+
$this->lazyLoad($eventName);
77+
78+
if (isset($this->listeners[$eventName])) {
79+
foreach ($this->listeners[$eventName] as $key => $l) {
80+
foreach ($this->listenerIds[$eventName] as $i => $args) {
81+
list($serviceId, $method, $priority) = $args;
82+
if ($key === $serviceId.'.'.$method) {
83+
if ($listener === array($l, $method)) {
84+
unset($this->listeners[$eventName][$key]);
85+
if (empty($this->listeners[$eventName])) {
86+
unset($this->listeners[$eventName]);
87+
}
88+
unset($this->listenerIds[$eventName][$i]);
89+
if (empty($this->listenerIds[$eventName])) {
90+
unset($this->listenerIds[$eventName]);
91+
}
92+
}
93+
}
94+
}
95+
}
96+
}
97+
98+
parent::removeListener($eventName, $listener);
99+
}
100+
74101
/**
75102
* @see EventDispatcherInterface::hasListeners
76103
*/
@@ -137,7 +164,7 @@ protected function lazyLoad($eventName)
137164
if (!isset($this->listeners[$eventName][$key])) {
138165
$this->addListener($eventName, array($listener, $method), $priority);
139166
} elseif ($listener !== $this->listeners[$eventName][$key]) {
140-
$this->removeListener($eventName, array($this->listeners[$eventName][$key], $method));
167+
parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
141168
$this->addListener($eventName, array($listener, $method), $priority);
142169
}
143170

src/Symfony/Bundle/FrameworkBundle/Tests/ContainerAwareEventDispatcherTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,39 @@ public function testGetListenersOnLazyLoad()
166166

167167
$this->assertEquals(1, count($dispatcher->getListeners('onEvent')));
168168
}
169+
170+
public function testRemoveAfterDispatch()
171+
{
172+
$event = new Event();
173+
174+
$service = $this->getMock('Symfony\Bundle\FrameworkBundle\Tests\Service');
175+
176+
$container = new Container();
177+
$container->set('service.listener', $service);
178+
179+
$dispatcher = new ContainerAwareEventDispatcher($container);
180+
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
181+
182+
$dispatcher->dispatch('onEvent', new Event());
183+
$dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent'));
184+
$this->assertFalse($dispatcher->hasListeners('onEvent'));
185+
}
186+
187+
public function testRemoveBeforeDispatch()
188+
{
189+
$event = new Event();
190+
191+
$service = $this->getMock('Symfony\Bundle\FrameworkBundle\Tests\Service');
192+
193+
$container = new Container();
194+
$container->set('service.listener', $service);
195+
196+
$dispatcher = new ContainerAwareEventDispatcher($container);
197+
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
198+
199+
$dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent'));
200+
$this->assertFalse($dispatcher->hasListeners('onEvent'));
201+
}
169202
}
170203

171204
class Service

0 commit comments

Comments
 (0)
0