[EventDispatcher] TraceableEventDispatcher resets listener priorities
This commit is contained in:
parent
cf1bc50385
commit
233e5b8df7
@ -235,12 +235,12 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
|
|||||||
private function preProcess($eventName)
|
private function preProcess($eventName)
|
||||||
{
|
{
|
||||||
foreach ($this->dispatcher->getListeners($eventName) as $listener) {
|
foreach ($this->dispatcher->getListeners($eventName) as $listener) {
|
||||||
$this->dispatcher->removeListener($eventName, $listener);
|
|
||||||
$info = $this->getListenerInfo($listener, $eventName);
|
$info = $this->getListenerInfo($listener, $eventName);
|
||||||
$name = isset($info['class']) ? $info['class'] : $info['type'];
|
$name = isset($info['class']) ? $info['class'] : $info['type'];
|
||||||
$wrappedListener = new WrappedListener($listener, $name, $this->stopwatch, $this);
|
$wrappedListener = new WrappedListener($listener, $name, $this->stopwatch, $this);
|
||||||
$this->wrappedListeners[$eventName][] = $wrappedListener;
|
$this->wrappedListeners[$eventName][] = $wrappedListener;
|
||||||
$this->dispatcher->addListener($eventName, $wrappedListener);
|
$this->dispatcher->removeListener($eventName, $listener);
|
||||||
|
$this->dispatcher->addListener($eventName, $wrappedListener, $info['priority']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,8 +253,9 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Unwrap listener
|
// Unwrap listener
|
||||||
|
$priority = $this->getListenerPriority($eventName, $listener);
|
||||||
$this->dispatcher->removeListener($eventName, $listener);
|
$this->dispatcher->removeListener($eventName, $listener);
|
||||||
$this->dispatcher->addListener($eventName, $listener->getWrappedListener());
|
$this->dispatcher->addListener($eventName, $listener->getWrappedListener(), $priority);
|
||||||
|
|
||||||
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
|
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
|
||||||
if ($listener->wasCalled()) {
|
if ($listener->wasCalled()) {
|
||||||
|
@ -56,6 +56,23 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertTrue($tdispatcher->hasListeners('foo'));
|
$this->assertTrue($tdispatcher->hasListeners('foo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetListenerPriority()
|
||||||
|
{
|
||||||
|
$dispatcher = new EventDispatcher();
|
||||||
|
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
|
||||||
|
|
||||||
|
$tdispatcher->addListener('foo', function () {}, 123);
|
||||||
|
|
||||||
|
$listeners = $dispatcher->getListeners('foo');
|
||||||
|
$this->assertSame(123, $tdispatcher->getListenerPriority('foo', $listeners[0]));
|
||||||
|
|
||||||
|
// Verify that priority is preserved when listener is removed and re-added
|
||||||
|
// in preProcess() and postProcess().
|
||||||
|
$tdispatcher->dispatch('foo', new Event());
|
||||||
|
$listeners = $dispatcher->getListeners('foo');
|
||||||
|
$this->assertSame(123, $tdispatcher->getListenerPriority('foo', $listeners[0]));
|
||||||
|
}
|
||||||
|
|
||||||
public function testAddRemoveSubscriber()
|
public function testAddRemoveSubscriber()
|
||||||
{
|
{
|
||||||
$dispatcher = new EventDispatcher();
|
$dispatcher = new EventDispatcher();
|
||||||
@ -138,12 +155,12 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$dispatcher = new EventDispatcher();
|
$dispatcher = new EventDispatcher();
|
||||||
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
|
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
|
||||||
$tdispatcher->addListener('foo', $listener1 = function () use (&$called) { $called[] = 'foo1'; });
|
$tdispatcher->addListener('foo', function () use (&$called) { $called[] = 'foo1'; }, 10);
|
||||||
$tdispatcher->addListener('foo', $listener2 = function () use (&$called) { $called[] = 'foo2'; });
|
$tdispatcher->addListener('foo', function () use (&$called) { $called[] = 'foo2'; }, 20);
|
||||||
|
|
||||||
$tdispatcher->dispatch('foo');
|
$tdispatcher->dispatch('foo');
|
||||||
|
|
||||||
$this->assertEquals(array('foo1', 'foo2'), $called);
|
$this->assertSame(array('foo2', 'foo1'), $called);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testDispatchNested()
|
public function testDispatchNested()
|
||||||
|
Reference in New Issue
Block a user