28 class EventDispatcher
implements EventDispatcherInterface
30 private $listeners = array();
31 private $sorted = array();
38 if (
null === $event) {
42 $event->setDispatcher($this);
43 $event->setName($eventName);
46 $this->
doDispatch($listeners, $eventName, $event);
57 if (
null !== $eventName) {
58 if (!isset($this->listeners[$eventName])) {
62 if (!isset($this->sorted[$eventName])) {
63 $this->sortListeners($eventName);
66 return $this->sorted[$eventName];
69 foreach ($this->listeners as $eventName => $eventListeners) {
70 if (!isset($this->sorted[$eventName])) {
71 $this->sortListeners($eventName);
75 return array_filter($this->sorted);
90 if (!isset($this->listeners[$eventName])) {
94 foreach ($this->listeners[$eventName] as $priority => $listeners) {
95 if (
false !== \in_array($listener, $listeners,
true)) {
114 $this->listeners[$eventName][$priority][] = $listener;
115 unset($this->sorted[$eventName]);
123 if (!isset($this->listeners[$eventName])) {
127 foreach ($this->listeners[$eventName] as $priority => $listeners) {
128 if (
false !== ($key = array_search($listener, $listeners,
true))) {
129 unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]);
140 if (\is_string($params)) {
141 $this->
addListener($eventName, array($subscriber, $params));
142 } elseif (\is_string($params[0])) {
143 $this->
addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
145 foreach ($params as $listener) {
146 $this->
addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
158 if (\is_array($params) && \is_array($params[0])) {
159 foreach ($params as $listener) {
160 $this->
removeListener($eventName, array($subscriber, $listener[0]));
163 $this->
removeListener($eventName, array($subscriber, \is_string($params) ? $params : $params[0]));
180 foreach ($listeners as $listener) {
184 \call_user_func($listener, $event, $eventName, $this);
193 private function sortListeners($eventName)
195 krsort($this->listeners[$eventName]);
196 $this->sorted[$eventName] = \call_user_func_array(
'array_merge', $this->listeners[$eventName]);