X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Flib%2FDrupal%2FComponent%2FEventDispatcher%2FContainerAwareEventDispatcher.php;fp=web%2Fcore%2Flib%2FDrupal%2FComponent%2FEventDispatcher%2FContainerAwareEventDispatcher.php;h=1fd808c17f7bd1ceae968a33b0d8836e8e51b4c7;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hp=a23f333a0ad7a192311ef9d535a34fc67b156ef5;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0;p=yaffs-website diff --git a/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php b/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php index a23f333a0..1fd808c17 100644 --- a/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php +++ b/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php @@ -104,8 +104,11 @@ class ContainerAwareEventDispatcher implements EventDispatcherInterface { if (!isset($definition['callable'])) { $definition['callable'] = [$this->container->get($definition['service'][0]), $definition['service'][1]]; } + if (is_array($definition['callable']) && isset($definition['callable'][0]) && $definition['callable'][0] instanceof \Closure) { + $definition['callable'][0] = $definition['callable'][0](); + } - $definition['callable']($event, $event_name, $this); + call_user_func($definition['callable'], $event, $event_name, $this); if ($event->isPropagationStopped()) { return $event; } @@ -144,6 +147,9 @@ class ContainerAwareEventDispatcher implements EventDispatcherInterface { if (!isset($definition['callable'])) { $definition['callable'] = [$this->container->get($definition['service'][0]), $definition['service'][1]]; } + if (is_array($definition['callable']) && isset($definition['callable'][0]) && $definition['callable'][0] instanceof \Closure) { + $definition['callable'][0] = $definition['callable'][0](); + } $result[] = $definition['callable']; } @@ -156,27 +162,29 @@ class ContainerAwareEventDispatcher implements EventDispatcherInterface { /** * {@inheritdoc} */ - public function getListenerPriority($eventName, $listener) { - // Parts copied from \Symfony\Component\EventDispatcher, that's why you see - // a yoda condition here. - if (!isset($this->listeners[$eventName])) { + public function getListenerPriority($event_name, $listener) { + if (!isset($this->listeners[$event_name])) { return; } - foreach ($this->listeners[$eventName] as $priority => $listeners) { - if (FALSE !== ($key = array_search(['callable' => $listener], $listeners, TRUE))) { - return $priority; - } + if (is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) { + $listener[0] = $listener[0](); } // Resolve service definitions if the listener has not been found so far. - foreach ($this->listeners[$eventName] as $priority => &$definitions) { + foreach ($this->listeners[$event_name] as $priority => &$definitions) { foreach ($definitions as $key => &$definition) { if (!isset($definition['callable'])) { // Once the callable is retrieved we keep it for subsequent method // invocations on this class. - $definition['callable'] = [$this->container->get($definition['service'][0]), $definition['service'][1]]; - if ($definition['callable'] === $listener) { - return $priority; - } + $definition['callable'] = [ + $this->container->get($definition['service'][0]), + $definition['service'][1], + ]; + } + if (is_array($definition['callable']) && isset($definition['callable'][0]) && $definition['callable'][0] instanceof \Closure) { + $definition['callable'][0] = $definition['callable'][0](); + } + if ($definition['callable'] === $listener) { + return $priority; } } } @@ -186,7 +194,17 @@ class ContainerAwareEventDispatcher implements EventDispatcherInterface { * {@inheritdoc} */ public function hasListeners($event_name = NULL) { - return (bool) count($this->getListeners($event_name)); + if ($event_name !== NULL) { + return !empty($this->listeners[$event_name]); + } + + foreach ($this->listeners as $event_listeners) { + if ($event_listeners) { + return TRUE; + } + } + + return FALSE; } /** @@ -214,10 +232,23 @@ class ContainerAwareEventDispatcher implements EventDispatcherInterface { $definition['callable'] = [$this->container->get($definition['service'][0]), $definition['service'][1]]; } + if (is_array($definition['callable']) && isset($definition['callable'][0]) && $definition['callable'][0] instanceof \Closure && !$listener instanceof \Closure) { + $definition['callable'][0] = $definition['callable'][0](); + } + + if (is_array($definition['callable']) && isset($definition['callable'][0]) && !$definition['callable'][0] instanceof \Closure && is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) { + $listener[0] = $listener[0](); + } if ($definition['callable'] === $listener) { - unset($this->listeners[$event_name][$priority][$key]); + unset($definitions[$key]); } } + if ($definitions) { + $this->listeners[$event_name][$priority] = $definitions; + } + else { + unset($this->listeners[$event_name][$priority]); + } } }