* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @author Jordan Alliot <jordan.alliot@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
*/
class EventDispatcher implements EventDispatcherInterface
{
public function getListeners($eventName = null)
{
if (null !== $eventName) {
- if (!isset($this->listeners[$eventName])) {
+ if (empty($this->listeners[$eventName])) {
return array();
}
*/
public function getListenerPriority($eventName, $listener)
{
- if (!isset($this->listeners[$eventName])) {
+ if (empty($this->listeners[$eventName])) {
return;
}
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
+ $listener[0] = $listener[0]();
+ }
+
foreach ($this->listeners[$eventName] as $priority => $listeners) {
- if (false !== in_array($listener, $listeners, true)) {
- return $priority;
+ foreach ($listeners as $k => $v) {
+ if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
+ $v[0] = $v[0]();
+ $this->listeners[$eventName][$priority][$k] = $v;
+ }
+ if ($v === $listener) {
+ return $priority;
+ }
}
}
}
*/
public function hasListeners($eventName = null)
{
- return (bool) $this->getListeners($eventName);
+ if (null !== $eventName) {
+ return !empty($this->listeners[$eventName]);
+ }
+
+ foreach ($this->listeners as $eventListeners) {
+ if ($eventListeners) {
+ return true;
+ }
+ }
+
+ return false;
}
/**
*/
public function removeListener($eventName, $listener)
{
- if (!isset($this->listeners[$eventName])) {
+ if (empty($this->listeners[$eventName])) {
return;
}
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
+ $listener[0] = $listener[0]();
+ }
+
foreach ($this->listeners[$eventName] as $priority => $listeners) {
- if (false !== ($key = array_search($listener, $listeners, true))) {
- unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]);
+ foreach ($listeners as $k => $v) {
+ if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
+ $v[0] = $v[0]();
+ }
+ if ($v === $listener) {
+ unset($listeners[$k], $this->sorted[$eventName]);
+ } else {
+ $listeners[$k] = $v;
+ }
+ }
+
+ if ($listeners) {
+ $this->listeners[$eventName][$priority] = $listeners;
+ } else {
+ unset($this->listeners[$eventName][$priority]);
}
}
}
public function addSubscriber(EventSubscriberInterface $subscriber)
{
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
- if (is_string($params)) {
+ if (\is_string($params)) {
$this->addListener($eventName, array($subscriber, $params));
- } elseif (is_string($params[0])) {
+ } elseif (\is_string($params[0])) {
$this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
} else {
foreach ($params as $listener) {
public function removeSubscriber(EventSubscriberInterface $subscriber)
{
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
- if (is_array($params) && is_array($params[0])) {
+ if (\is_array($params) && \is_array($params[0])) {
foreach ($params as $listener) {
$this->removeListener($eventName, array($subscriber, $listener[0]));
}
} else {
- $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0]));
+ $this->removeListener($eventName, array($subscriber, \is_string($params) ? $params : $params[0]));
}
}
}
if ($event->isPropagationStopped()) {
break;
}
- call_user_func($listener, $event, $eventName, $this);
+ \call_user_func($listener, $event, $eventName, $this);
}
}
private function sortListeners($eventName)
{
krsort($this->listeners[$eventName]);
- $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
+ $this->sorted[$eventName] = array();
+
+ foreach ($this->listeners[$eventName] as $priority => $listeners) {
+ foreach ($listeners as $k => $listener) {
+ if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
+ $listener[0] = $listener[0]();
+ $this->listeners[$eventName][$priority][$k] = $listener;
+ }
+ $this->sorted[$eventName][] = $listener;
+ }
+ }
}
}