Skip to content

Commit 985f8e3

Browse files
Merge branch '5.4' into 6.3
* 5.4: [Process] Fix test case [Workflow] fix MermaidDumper when place contains special char [DoctrineBridge] Bugfix - Allow to remove LazyLoaded listeners by object [Messenger] Add forward compatibily with php-amqp v2
2 parents 61c7d16 + e404e40 commit 985f8e3

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

ContainerAwareEventManager.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ContainerAwareEventManager extends EventManager
3131
private array $listeners = [];
3232
private array $initialized = [];
3333
private bool $initializedSubscribers = false;
34+
private array $initializedHashMapping = [];
3435
private array $methods = [];
3536
private ContainerInterface $container;
3637

@@ -119,6 +120,7 @@ public function addEventListener($events, $listener): void
119120

120121
if (\is_string($listener)) {
121122
unset($this->initialized[$event]);
123+
unset($this->initializedHashMapping[$event][$hash]);
122124
} else {
123125
$this->methods[$event][$hash] = $this->getMethod($listener, $event);
124126
}
@@ -134,6 +136,11 @@ public function removeEventListener($events, $listener): void
134136
$hash = $this->getHash($listener);
135137

136138
foreach ((array) $events as $event) {
139+
if (isset($this->initializedHashMapping[$event][$hash])) {
140+
$hash = $this->initializedHashMapping[$event][$hash];
141+
unset($this->initializedHashMapping[$event][$hash]);
142+
}
143+
137144
// Check if we actually have this listener associated
138145
if (isset($this->listeners[$event][$hash])) {
139146
unset($this->listeners[$event][$hash]);
@@ -166,13 +173,25 @@ public function removeEventSubscriber(EventSubscriber $subscriber): void
166173
private function initializeListeners(string $eventName): void
167174
{
168175
$this->initialized[$eventName] = true;
176+
177+
// We'll refill the whole array in order to keep the same order
178+
$listeners = [];
169179
foreach ($this->listeners[$eventName] as $hash => $listener) {
170180
if (\is_string($listener)) {
171-
$this->listeners[$eventName][$hash] = $listener = $this->container->get($listener);
181+
$listener = $this->container->get($listener);
182+
$newHash = $this->getHash($listener);
172183

173-
$this->methods[$eventName][$hash] = $this->getMethod($listener, $eventName);
184+
$this->initializedHashMapping[$eventName][$hash] = $newHash;
185+
186+
$listeners[$newHash] = $listener;
187+
188+
$this->methods[$eventName][$newHash] = $this->getMethod($listener, $eventName);
189+
} else {
190+
$listeners[$hash] = $listener;
174191
}
175192
}
193+
194+
$this->listeners[$eventName] = $listeners;
176195
}
177196

178197
private function initializeSubscribers(): void

Tests/ContainerAwareEventManagerTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,21 @@ public function testRemoveEventListener()
281281
$this->assertSame([], $this->evm->getListeners('foo'));
282282
}
283283

284+
public function testRemoveAllEventListener()
285+
{
286+
$this->container->set('lazy', new MyListener());
287+
$this->evm->addEventListener('foo', 'lazy');
288+
$this->evm->addEventListener('foo', new MyListener());
289+
290+
foreach ($this->evm->getAllListeners() as $event => $listeners) {
291+
foreach ($listeners as $listener) {
292+
$this->evm->removeEventListener($event, $listener);
293+
}
294+
}
295+
296+
$this->assertSame([], $this->evm->getListeners('foo'));
297+
}
298+
284299
public function testRemoveEventListenerAfterDispatchEvent()
285300
{
286301
$this->container->set('lazy', $listener1 = new MyListener());

0 commit comments

Comments
 (0)