Open Journal Systems  3.3.0
lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.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 
14 use Symfony\Component\DependencyInjection\ContainerInterface;
15 
25 {
26  private $container;
27 
31  private $listenerIds = array();
32 
36  private $listeners = array();
37 
38  public function __construct(ContainerInterface $container)
39  {
40  $this->container = $container;
41  }
42 
55  public function addListenerService($eventName, $callback, $priority = 0)
56  {
57  if (!\is_array($callback) || 2 !== \count($callback)) {
58  throw new \InvalidArgumentException('Expected an array("service", "method") argument');
59  }
60 
61  $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority);
62  }
63 
64  public function removeListener($eventName, $listener)
65  {
66  $this->lazyLoad($eventName);
67 
68  if (isset($this->listenerIds[$eventName])) {
69  foreach ($this->listenerIds[$eventName] as $i => $args) {
70  list($serviceId, $method) = $args;
71  $key = $serviceId.'.'.$method;
72  if (isset($this->listeners[$eventName][$key]) && $listener === array($this->listeners[$eventName][$key], $method)) {
73  unset($this->listeners[$eventName][$key]);
74  if (empty($this->listeners[$eventName])) {
75  unset($this->listeners[$eventName]);
76  }
77  unset($this->listenerIds[$eventName][$i]);
78  if (empty($this->listenerIds[$eventName])) {
79  unset($this->listenerIds[$eventName]);
80  }
81  }
82  }
83  }
84 
85  parent::removeListener($eventName, $listener);
86  }
87 
91  public function hasListeners($eventName = null)
92  {
93  if (null === $eventName) {
94  return $this->listenerIds || $this->listeners || parent::hasListeners();
95  }
96 
97  if (isset($this->listenerIds[$eventName])) {
98  return true;
99  }
100 
101  return parent::hasListeners($eventName);
102  }
103 
107  public function getListeners($eventName = null)
108  {
109  if (null === $eventName) {
110  foreach ($this->listenerIds as $serviceEventName => $args) {
111  $this->lazyLoad($serviceEventName);
112  }
113  } else {
114  $this->lazyLoad($eventName);
115  }
116 
117  return parent::getListeners($eventName);
118  }
119 
123  public function getListenerPriority($eventName, $listener)
124  {
125  $this->lazyLoad($eventName);
126 
127  return parent::getListenerPriority($eventName, $listener);
128  }
129 
136  public function addSubscriberService($serviceId, $class)
137  {
138  foreach ($class::getSubscribedEvents() as $eventName => $params) {
139  if (\is_string($params)) {
140  $this->listenerIds[$eventName][] = array($serviceId, $params, 0);
141  } elseif (\is_string($params[0])) {
142  $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0);
143  } else {
144  foreach ($params as $listener) {
145  $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0);
146  }
147  }
148  }
149  }
150 
151  public function getContainer()
152  {
153  return $this->container;
154  }
155 
164  protected function lazyLoad($eventName)
165  {
166  if (isset($this->listenerIds[$eventName])) {
167  foreach ($this->listenerIds[$eventName] as $args) {
168  list($serviceId, $method, $priority) = $args;
169  $listener = $this->container->get($serviceId);
170 
171  $key = $serviceId.'.'.$method;
172  if (!isset($this->listeners[$eventName][$key])) {
173  $this->addListener($eventName, array($listener, $method), $priority);
174  } elseif ($this->listeners[$eventName][$key] !== $listener) {
175  parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
176  $this->addListener($eventName, array($listener, $method), $priority);
177  }
178 
179  $this->listeners[$eventName][$key] = $listener;
180  }
181  }
182  }
183 }
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\__construct
__construct(ContainerInterface $container)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:38
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\removeListener
removeListener($eventName, $listener)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:64
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\getListeners
getListeners($eventName=null)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:107
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\getContainer
getContainer()
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:151
Symfony\Component\EventDispatcher
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:12
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:24
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\hasListeners
hasListeners($eventName=null)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:91
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\addListenerService
addListenerService($eventName, $callback, $priority=0)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:55
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\lazyLoad
lazyLoad($eventName)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:164
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
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\getListenerPriority
getListenerPriority($eventName, $listener)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:123
Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher\addSubscriberService
addSubscriberService($serviceId, $class)
Definition: lib/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php:136