diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterKernelListenersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterKernelListenersPass.php index 8227e24..1c607cb 100644 --- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterKernelListenersPass.php +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterKernelListenersPass.php @@ -19,6 +19,7 @@ public function process(ContainerBuilder $container) { $definition = $container->getDefinition('event_dispatcher'); $event_subscriber_info = []; + $weights = []; foreach ($container->findTaggedServiceIds('event_subscriber') as $id => $attributes) { // We must assume that the class value has been correctly filled, even if the service is created by a factory @@ -33,18 +34,24 @@ public function process(ContainerBuilder $container) { // Get all subscribed events. foreach ($class::getSubscribedEvents() as $event_name => $params) { if (is_string($params)) { - $event_subscriber_info[$event_name][] = array($id, $params, 0); + $event_subscriber_info[$event_name][] = array($id, $params); + $weights[$event_name][] = 0; } elseif (is_string($params[0])) { - $event_subscriber_info[$event_name][] = array($id, $params[0], isset($params[1]) ? $params[1] : 0); + $event_subscriber_info[$event_name][] = array($id, $params[0]); + $weights[$event_name][] = isset($params[1]) ? $params[1] : 0; } else { foreach ($params as $listener) { - $event_subscriber_info[$event_name][] = array($id, $listener[0], isset($listener[1]) ? $listener[1] : 0); + $event_subscriber_info[$event_name][] = array($id, $listener[0]); + $weights[$event_name][] = isset($listener[1]) ? $listener[1] : 0; } } } } + foreach ($weights as $event_name => $sort_weights) { + array_multisort($sort_weights, SORT_NUMERIC, $event_subscriber_info[$event_name]); + } $definition->addArgument($event_subscriber_info); } } diff --git a/core/lib/Drupal/Core/EventSubscriber/ContainerAwareEventDispatcher.php b/core/lib/Drupal/Core/EventSubscriber/ContainerAwareEventDispatcher.php index 6b537a4..a28d92b 100644 --- a/core/lib/Drupal/Core/EventSubscriber/ContainerAwareEventDispatcher.php +++ b/core/lib/Drupal/Core/EventSubscriber/ContainerAwareEventDispatcher.php @@ -43,6 +43,33 @@ public function __construct(ContainerInterface $container, array $listener_ids = } /** + * {@inheritDoc} + * + * Lazily loads listeners for this event from the dependency injection + * container. + * + * @throws \InvalidArgumentException if the service is not defined + */ + public function dispatch($eventName, Event $event = NULL) { + if (null === $event) { + $event = new Event(); + } + + $event->setDispatcher($this); + $event->setName($eventName); + if (isset($this->listenerIds[$eventName])) { + foreach ($this->listenerIds[$eventName] as $args) { + list($serviceId, $method) = $args; + $this->container->get($serviceId)->$method($event, $eventName, $this); + if ($event->isPropagationStopped()) { + break; + } + } + } + return $event; + } + + /** * Adds a service as event listener * * @param string $eventName Event for which the listener is added @@ -154,24 +181,6 @@ public function addSubscriberService($serviceId, $class) { } /** - * {@inheritDoc} - * - * Lazily loads listeners for this event from the dependency injection - * container. - * - * @throws \InvalidArgumentException if the service is not defined - */ - public function dispatch($eventName, Event $event = NULL) { - $this->lazyLoad($eventName); - - return parent::dispatch($eventName, $event); - } - - public function getContainer() { - return $this->container; - } - - /** * Lazily loads listeners for this event from the dependency injection * container. *