Skip to content

Commit 683169b

Browse files
committed
[EventDispatcher] TraceableEventDispatcher resets listener priorities
1 parent a729462 commit 683169b

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,12 @@ protected function postDispatch($eventName, Event $event)
235235
private function preProcess($eventName)
236236
{
237237
foreach ($this->dispatcher->getListeners($eventName) as $listener) {
238-
$this->dispatcher->removeListener($eventName, $listener);
239238
$info = $this->getListenerInfo($listener, $eventName);
240239
$name = isset($info['class']) ? $info['class'] : $info['type'];
241240
$wrappedListener = new WrappedListener($listener, $name, $this->stopwatch, $this);
242241
$this->wrappedListeners[$eventName][] = $wrappedListener;
243-
$this->dispatcher->addListener($eventName, $wrappedListener);
242+
$this->dispatcher->removeListener($eventName, $listener);
243+
$this->dispatcher->addListener($eventName, $wrappedListener, $info['priority']);
244244
}
245245
}
246246

@@ -253,8 +253,9 @@ private function postProcess($eventName)
253253
continue;
254254
}
255255
// Unwrap listener
256+
$priority = $this->getListenerPriority($eventName, $listener);
256257
$this->dispatcher->removeListener($eventName, $listener);
257-
$this->dispatcher->addListener($eventName, $listener->getWrappedListener());
258+
$this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority);
258259

259260
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
260261
if ($listener->wasCalled()) {

src/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php

+20-3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,23 @@ public function testHasListeners()
5656
$this->assertTrue($tdispatcher->hasListeners('foo'));
5757
}
5858

59+
public function testGetListenerPriority()
60+
{
61+
$dispatcher = new EventDispatcher();
62+
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
63+
64+
$tdispatcher->addListener('foo', function () {}, 123);
65+
66+
$listeners = $dispatcher->getListeners('foo');
67+
$this->assertSame(123, $tdispatcher->getListenerPriority('foo', $listeners[0]));
68+
69+
// Verify that priority is preserved when listener is removed and re-added
70+
// in preProcess() and postProcess().
71+
$tdispatcher->dispatch('foo', new Event());
72+
$listeners = $dispatcher->getListeners('foo');
73+
$this->assertSame(123, $tdispatcher->getListenerPriority('foo', $listeners[0]));
74+
}
75+
5976
public function testAddRemoveSubscriber()
6077
{
6178
$dispatcher = new EventDispatcher();
@@ -138,12 +155,12 @@ public function testDispatchCallListeners()
138155

139156
$dispatcher = new EventDispatcher();
140157
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
141-
$tdispatcher->addListener('foo', $listener1 = function () use (&$called) { $called[] = 'foo1'; });
142-
$tdispatcher->addListener('foo', $listener2 = function () use (&$called) { $called[] = 'foo2'; });
158+
$tdispatcher->addListener('foo', $listener1 = function () use (&$called) { $called[] = 'foo1'; }, 10);
159+
$tdispatcher->addListener('foo', $listener2 = function () use (&$called) { $called[] = 'foo2'; }, 20);
143160

144161
$tdispatcher->dispatch('foo');
145162

146-
$this->assertEquals(array('foo1', 'foo2'), $called);
163+
$this->assertSame(array('foo2', 'foo1'), $called);
147164
}
148165

149166
public function testDispatchNested()

0 commit comments

Comments
 (0)