Skip to content

Commit 149fd29

Browse files
Merge branch '6.0' into 6.1
* 6.0: [Console] Better required argument check in InputArgument [EventDispatcher] Fix removing listeners when using first-class callable syntax
2 parents 00cd271 + 5c85b58 commit 149fd29

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

Debug/TraceableEventDispatcher.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public function removeListener(string $eventName, callable|array $listener)
7474
{
7575
if (isset($this->wrappedListeners[$eventName])) {
7676
foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) {
77-
if ($wrappedListener->getWrappedListener() === $listener) {
77+
if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) {
7878
$listener = $wrappedListener;
7979
unset($this->wrappedListeners[$eventName][$index]);
8080
break;
@@ -110,7 +110,7 @@ public function getListenerPriority(string $eventName, callable|array $listener)
110110
// in that case get the priority by wrapper
111111
if (isset($this->wrappedListeners[$eventName])) {
112112
foreach ($this->wrappedListeners[$eventName] as $wrappedListener) {
113-
if ($wrappedListener->getWrappedListener() === $listener) {
113+
if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) {
114114
return $this->dispatcher->getListenerPriority($eventName, $wrappedListener);
115115
}
116116
}

EventDispatcher.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public function getListenerPriority(string $eventName, callable|array $listener)
108108
$v[0] = $v[0]();
109109
$v[1] ??= '__invoke';
110110
}
111-
if ($v === $listener) {
111+
if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) {
112112
return $priority;
113113
}
114114
}
@@ -164,7 +164,7 @@ public function removeListener(string $eventName, callable|array $listener)
164164
$v[0] = $v[0]();
165165
$v[1] ??= '__invoke';
166166
}
167-
if ($v === $listener) {
167+
if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) {
168168
unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]);
169169
}
170170
}

Tests/EventDispatcherTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,35 @@ public function testMutatingWhilePropagationIsStopped()
405405

406406
$this->assertTrue($testLoaded);
407407
}
408+
409+
/**
410+
* @requires PHP 8.1
411+
*/
412+
public function testNamedClosures()
413+
{
414+
$listener = new TestEventListener();
415+
416+
$callback1 = $listener(...);
417+
$callback2 = $listener(...);
418+
$callback3 = (new TestEventListener())(...);
419+
420+
$this->assertNotSame($callback1, $callback2);
421+
$this->assertNotSame($callback1, $callback3);
422+
$this->assertNotSame($callback2, $callback3);
423+
$this->assertTrue($callback1 == $callback2);
424+
$this->assertFalse($callback1 == $callback3);
425+
426+
$this->dispatcher->addListener('foo', $callback1, 3);
427+
$this->dispatcher->addListener('foo', $callback2, 2);
428+
$this->dispatcher->addListener('foo', $callback3, 1);
429+
430+
$this->assertSame(3, $this->dispatcher->getListenerPriority('foo', $callback1));
431+
$this->assertSame(3, $this->dispatcher->getListenerPriority('foo', $callback2));
432+
433+
$this->dispatcher->removeListener('foo', $callback1);
434+
435+
$this->assertSame(['foo' => [$callback3]], $this->dispatcher->getListeners());
436+
}
408437
}
409438

410439
class CallableClass

0 commit comments

Comments
 (0)