diff --git a/EventDispatch.php b/EventDispatch.php index 77296c7..9e3e3c0 100644 --- a/EventDispatch.php +++ b/EventDispatch.php @@ -36,17 +36,19 @@ class EventDispatch extends Component implements EventDispatcherInterface */ public function dispatch(object $event): object { + /** @var \SplPriorityQueue $lists */ $lists = $this->eventProvider->getListenersForEvent($event); - foreach ($lists as $listener) { - /** @var Struct $list */ - try { - $listener($event); - }catch (\Throwable $exception) { - $this->logger->error($exception->getMessage(), [$exception]); - } + $lists->top(); + while ($lists->valid()) { + try { + call_user_func($lists->current(), $event); + } catch (\Throwable $exception) { + $this->logger->error($exception->getMessage(), [$exception]); + } if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { break; } + $lists->next(); } return $event; } diff --git a/EventProvider.php b/EventProvider.php index af42703..2b109a7 100644 --- a/EventProvider.php +++ b/EventProvider.php @@ -4,6 +4,7 @@ namespace Kiri\Events; use Psr\EventDispatcher\ListenerProviderInterface; +use SplPriorityQueue; /** * @@ -17,11 +18,12 @@ class EventProvider implements ListenerProviderInterface /** * @param object $event - * @return iterable + * @return SplPriorityQueue */ - public function getListenersForEvent(object $event): iterable + public function getListenersForEvent(object $event): SplPriorityQueue { - $queue = new \SplPriorityQueue(); + $queue = new SplPriorityQueue(); + $queue->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY); // TODO: Implement getListenersForEvent() method. foreach ($this->_listeners[get_class($event)] ?? [] as $listener) { $queue->insert($listener->listener, $listener->priority);