first commit
This commit is contained in:
		
							
								
								
									
										236
									
								
								vendor/symfony/event-dispatcher/EventDispatcher.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								vendor/symfony/event-dispatcher/EventDispatcher.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,236 @@ | ||||
| <?php | ||||
|  | ||||
| /* | ||||
|  * This file is part of the Symfony package. | ||||
|  * | ||||
|  * (c) Fabien Potencier <fabien@symfony.com> | ||||
|  * | ||||
|  * For the full copyright and license information, please view the LICENSE | ||||
|  * file that was distributed with this source code. | ||||
|  */ | ||||
|  | ||||
| namespace Symfony\Component\EventDispatcher; | ||||
|  | ||||
| /** | ||||
|  * The EventDispatcherInterface is the central point of Symfony's event listener system. | ||||
|  * | ||||
|  * Listeners are registered on the manager and events are dispatched through the | ||||
|  * manager. | ||||
|  * | ||||
|  * @author Guilherme Blanco <guilhermeblanco@hotmail.com> | ||||
|  * @author Jonathan Wage <jonwage@gmail.com> | ||||
|  * @author Roman Borschel <roman@code-factory.org> | ||||
|  * @author Bernhard Schussek <bschussek@gmail.com> | ||||
|  * @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 | ||||
| { | ||||
|     private $listeners = []; | ||||
|     private $sorted = []; | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function dispatch($eventName, Event $event = null) | ||||
|     { | ||||
|         if (null === $event) { | ||||
|             $event = new Event(); | ||||
|         } | ||||
|  | ||||
|         if ($listeners = $this->getListeners($eventName)) { | ||||
|             $this->doDispatch($listeners, $eventName, $event); | ||||
|         } | ||||
|  | ||||
|         return $event; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function getListeners($eventName = null) | ||||
|     { | ||||
|         if (null !== $eventName) { | ||||
|             if (empty($this->listeners[$eventName])) { | ||||
|                 return []; | ||||
|             } | ||||
|  | ||||
|             if (!isset($this->sorted[$eventName])) { | ||||
|                 $this->sortListeners($eventName); | ||||
|             } | ||||
|  | ||||
|             return $this->sorted[$eventName]; | ||||
|         } | ||||
|  | ||||
|         foreach ($this->listeners as $eventName => $eventListeners) { | ||||
|             if (!isset($this->sorted[$eventName])) { | ||||
|                 $this->sortListeners($eventName); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return array_filter($this->sorted); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function getListenerPriority($eventName, $listener) | ||||
|     { | ||||
|         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) { | ||||
|             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; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function hasListeners($eventName = null) | ||||
|     { | ||||
|         if (null !== $eventName) { | ||||
|             return !empty($this->listeners[$eventName]); | ||||
|         } | ||||
|  | ||||
|         foreach ($this->listeners as $eventListeners) { | ||||
|             if ($eventListeners) { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function addListener($eventName, $listener, $priority = 0) | ||||
|     { | ||||
|         $this->listeners[$eventName][$priority][] = $listener; | ||||
|         unset($this->sorted[$eventName]); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function removeListener($eventName, $listener) | ||||
|     { | ||||
|         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) { | ||||
|             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]); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function addSubscriber(EventSubscriberInterface $subscriber) | ||||
|     { | ||||
|         foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { | ||||
|             if (\is_string($params)) { | ||||
|                 $this->addListener($eventName, [$subscriber, $params]); | ||||
|             } elseif (\is_string($params[0])) { | ||||
|                 $this->addListener($eventName, [$subscriber, $params[0]], isset($params[1]) ? $params[1] : 0); | ||||
|             } else { | ||||
|                 foreach ($params as $listener) { | ||||
|                     $this->addListener($eventName, [$subscriber, $listener[0]], isset($listener[1]) ? $listener[1] : 0); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      */ | ||||
|     public function removeSubscriber(EventSubscriberInterface $subscriber) | ||||
|     { | ||||
|         foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { | ||||
|             if (\is_array($params) && \is_array($params[0])) { | ||||
|                 foreach ($params as $listener) { | ||||
|                     $this->removeListener($eventName, [$subscriber, $listener[0]]); | ||||
|                 } | ||||
|             } else { | ||||
|                 $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Triggers the listeners of an event. | ||||
|      * | ||||
|      * This method can be overridden to add functionality that is executed | ||||
|      * for each listener. | ||||
|      * | ||||
|      * @param callable[] $listeners The event listeners | ||||
|      * @param string     $eventName The name of the event to dispatch | ||||
|      * @param Event      $event     The event object to pass to the event handlers/listeners | ||||
|      */ | ||||
|     protected function doDispatch($listeners, $eventName, Event $event) | ||||
|     { | ||||
|         foreach ($listeners as $listener) { | ||||
|             if ($event->isPropagationStopped()) { | ||||
|                 break; | ||||
|             } | ||||
|             $listener($event, $eventName, $this); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sorts the internal list of listeners for the given event by priority. | ||||
|      * | ||||
|      * @param string $eventName The name of the event | ||||
|      */ | ||||
|     private function sortListeners($eventName) | ||||
|     { | ||||
|         krsort($this->listeners[$eventName]); | ||||
|         $this->sorted[$eventName] = []; | ||||
|  | ||||
|         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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user