Open Journal Systems  3.3.0
lib/vendor/symfony/event-dispatcher/EventDispatcher.php
1 <?php
2 
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 
13 
29 {
30  private $listeners = array();
31  private $sorted = array();
32 
36  public function dispatch($eventName, Event $event = null)
37  {
38  if (null === $event) {
39  $event = new Event();
40  }
41 
42  $event->setDispatcher($this);
43  $event->setName($eventName);
44 
45  if ($listeners = $this->getListeners($eventName)) {
46  $this->doDispatch($listeners, $eventName, $event);
47  }
48 
49  return $event;
50  }
51 
55  public function getListeners($eventName = null)
56  {
57  if (null !== $eventName) {
58  if (!isset($this->listeners[$eventName])) {
59  return array();
60  }
61 
62  if (!isset($this->sorted[$eventName])) {
63  $this->sortListeners($eventName);
64  }
65 
66  return $this->sorted[$eventName];
67  }
68 
69  foreach ($this->listeners as $eventName => $eventListeners) {
70  if (!isset($this->sorted[$eventName])) {
71  $this->sortListeners($eventName);
72  }
73  }
74 
75  return array_filter($this->sorted);
76  }
77 
88  public function getListenerPriority($eventName, $listener)
89  {
90  if (!isset($this->listeners[$eventName])) {
91  return;
92  }
93 
94  foreach ($this->listeners[$eventName] as $priority => $listeners) {
95  if (false !== \in_array($listener, $listeners, true)) {
96  return $priority;
97  }
98  }
99  }
100 
104  public function hasListeners($eventName = null)
105  {
106  return (bool) $this->getListeners($eventName);
107  }
108 
112  public function addListener($eventName, $listener, $priority = 0)
113  {
114  $this->listeners[$eventName][$priority][] = $listener;
115  unset($this->sorted[$eventName]);
116  }
117 
121  public function removeListener($eventName, $listener)
122  {
123  if (!isset($this->listeners[$eventName])) {
124  return;
125  }
126 
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]);
130  }
131  }
132  }
133 
137  public function addSubscriber(EventSubscriberInterface $subscriber)
138  {
139  foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
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);
144  } else {
145  foreach ($params as $listener) {
146  $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
147  }
148  }
149  }
150  }
151 
155  public function removeSubscriber(EventSubscriberInterface $subscriber)
156  {
157  foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
158  if (\is_array($params) && \is_array($params[0])) {
159  foreach ($params as $listener) {
160  $this->removeListener($eventName, array($subscriber, $listener[0]));
161  }
162  } else {
163  $this->removeListener($eventName, array($subscriber, \is_string($params) ? $params : $params[0]));
164  }
165  }
166  }
167 
178  protected function doDispatch($listeners, $eventName, Event $event)
179  {
180  foreach ($listeners as $listener) {
181  if ($event->isPropagationStopped()) {
182  break;
183  }
184  \call_user_func($listener, $event, $eventName, $this);
185  }
186  }
187 
193  private function sortListeners($eventName)
194  {
195  krsort($this->listeners[$eventName]);
196  $this->sorted[$eventName] = \call_user_func_array('array_merge', $this->listeners[$eventName]);
197  }
198 }
Symfony\Component\EventDispatcher\EventDispatcher\hasListeners
hasListeners($eventName=null)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:104
Symfony\Component\EventDispatcher\EventDispatcher\dispatch
dispatch($eventName, Event $event=null)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:36
Symfony\Component\EventDispatcher\EventSubscriberInterface
Definition: lib/vendor/symfony/event-dispatcher/EventSubscriberInterface.php:25
Symfony\Component\EventDispatcher
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:12
Symfony\Component\EventDispatcher\EventDispatcher\getListeners
getListeners($eventName=null)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:55
Symfony\Component\EventDispatcher\EventDispatcher\removeListener
removeListener($eventName, $listener)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:121
Symfony\Component\EventDispatcher\EventDispatcher\removeSubscriber
removeSubscriber(EventSubscriberInterface $subscriber)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:155
Symfony\Component\EventDispatcher\EventDispatcher\getListenerPriority
getListenerPriority($eventName, $listener)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:88
Symfony\Component\EventDispatcher\Event\isPropagationStopped
isPropagationStopped()
Definition: lib/vendor/symfony/event-dispatcher/Event.php:61
Symfony\Component\EventDispatcher\EventSubscriberInterface\getSubscribedEvents
static getSubscribedEvents()
Symfony\Component\EventDispatcher\EventDispatcher\addSubscriber
addSubscriber(EventSubscriberInterface $subscriber)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:137
Symfony\Component\EventDispatcher\EventDispatcherInterface
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcherInterface.php:21
Symfony\Component\EventDispatcher\EventDispatcher\doDispatch
doDispatch($listeners, $eventName, Event $event)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:178
Symfony\Component\EventDispatcher\Event
Definition: lib/vendor/symfony/event-dispatcher/Event.php:28
Symfony\Component\EventDispatcher\EventDispatcher
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:28
Symfony\Component\EventDispatcher\EventDispatcher\addListener
addListener($eventName, $listener, $priority=0)
Definition: lib/vendor/symfony/event-dispatcher/EventDispatcher.php:112