Restore priority for eventSubscribers

This commit is contained in:
Jérémy Derussé 2021-01-31 11:59:31 +01:00
parent 945c7c590c
commit 94eac1b83f
No known key found for this signature in database
GPG Key ID: 2083FA5758C473D2
2 changed files with 15 additions and 1 deletions

View File

@ -164,11 +164,22 @@ class ContainerAwareEventManager extends EventManager
private function initializeSubscribers() private function initializeSubscribers()
{ {
$this->initializedSubscribers = true; $this->initializedSubscribers = true;
$eventListeners = $this->listeners;
// reset eventListener to respect priority: EventSubscribers have a higher priority
$this->listeners = [];
foreach ($this->subscribers as $id => $subscriber) { foreach ($this->subscribers as $id => $subscriber) {
if (\is_string($subscriber)) { if (\is_string($subscriber)) {
parent::addEventSubscriber($this->subscribers[$id] = $this->container->get($subscriber)); parent::addEventSubscriber($this->subscribers[$id] = $this->container->get($subscriber));
} }
} }
foreach ($eventListeners as $event => $listeners) {
if (!isset($this->listeners[$event])) {
$this->listeners[$event] = [];
}
$this->listeners[$event] += $listeners;
}
$this->subscribers = [];
} }
/** /**

View File

@ -146,11 +146,14 @@ class ContainerAwareEventManagerTest extends TestCase
public function testGetListenersForEvent() public function testGetListenersForEvent()
{ {
$this->evm = new ContainerAwareEventManager($this->container, ['lazy2']);
$this->container->set('lazy', $listener1 = new MyListener()); $this->container->set('lazy', $listener1 = new MyListener());
$this->container->set('lazy2', $subscriber1 = new MySubscriber(['foo']));
$this->evm->addEventListener('foo', 'lazy'); $this->evm->addEventListener('foo', 'lazy');
$this->evm->addEventListener('foo', $listener2 = new MyListener()); $this->evm->addEventListener('foo', $listener2 = new MyListener());
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners('foo'))); $this->assertSame([$subscriber1, $listener1, $listener2], array_values($this->evm->getListeners('foo')));
} }
public function testGetListeners() public function testGetListeners()