Skip to content

Commit

Permalink
Merge pull request #101 from wenbinye/fix-onetimelistener
Browse files Browse the repository at this point in the history
Fix PrioritizedListenersForEvent when OneTimeListener added
  • Loading branch information
frankdejonge committed Oct 28, 2022
2 parents 6d6d88d + 6fbbc2a commit e1fc276
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/PrioritizedListenersForEvent.php
Expand Up @@ -48,6 +48,7 @@ public function getListeners(): iterable
private function sortListeners(): void
{
$this->isSorted = true;
$this->sortedListeners = [];
krsort($this->listeners, SORT_NUMERIC);

foreach ($this->listeners as $group) {
Expand All @@ -66,7 +67,7 @@ private function removeOneTimeListeners(): void
$this->sortedListeners = array_filter($this->sortedListeners, $filter);

foreach ($this->listeners as $priority => $listeners) {
$this->listeners[$priority] = array_filter($this->sortedListeners, $filter);
$this->listeners[$priority] = array_filter($listeners, $filter);
}
}
}
42 changes: 42 additions & 0 deletions src/PrioritizedListenersForEventTest.php
@@ -0,0 +1,42 @@
<?php

namespace League\Event;

use PHPUnit\Framework\TestCase;

class PrioritizedListenersForEventTest extends TestCase
{
public function testOneTimeListener(): void
{
$group = new PrioritizedListenersForEvent();
$group->addListener(function () {
return 1;
}, 1);
$group->addListener(function () {
return 2;
}, 2);
$group->addListener(new OneTimeListener(function () {
return 3;
}), 3);
$listener1 = $group->getListeners();
$this->assertCount(3, $listener1);
$this->assertEquals([null, 2, 1], self::inspectListener($listener1));

$group->addListener(function () {
return 4;
}, 4);
$listener2 = $group->getListeners();
$this->assertCount(3, $listener2);
$this->assertEquals([4, 2, 1], self::inspectListener($listener2));
}

public static function inspectListener(iterable $listeners): array
{
$event = new \stdClass();
$ret = [];
foreach ($listeners as $listener) {
$ret[] = $listener($event);
}
return $ret;
}
}

0 comments on commit e1fc276

Please sign in to comment.