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;
}
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'];
}
/**
* {@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;
}
}
}
* {@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;
}
/**
$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]);
+ }
}
}