name: EventDispatcher class_comment: '# * 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 # * @author Jonathan Wage # * @author Roman Borschel # * @author Bernhard Schussek # * @author Fabien Potencier # * @author Jordi Boggiano # * @author Jordan Alliot # * @author Nicolas Grekas ' dependencies: - name: StoppableEventInterface type: class source: Psr\EventDispatcher\StoppableEventInterface - name: WrappedListener type: class source: Symfony\Component\EventDispatcher\Debug\WrappedListener properties: [] methods: - name: callListeners visibility: protected parameters: - name: listeners - name: eventName - name: event comment: "# * The EventDispatcherInterface is the central point of Symfony's event\ \ listener system.\n# *\n# * Listeners are registered on the manager and events\ \ are dispatched through the\n# * manager.\n# *\n# * @author Guilherme Blanco\ \ \n# * @author Jonathan Wage \n\ # * @author Roman Borschel \n# * @author Bernhard Schussek\ \ \n# * @author Fabien Potencier \n#\ \ * @author Jordi Boggiano \n# * @author Jordan Alliot \n\ # * @author Nicolas Grekas \n# */\n# class EventDispatcher implements\ \ EventDispatcherInterface\n# {\n# private array $listeners = [];\n# private array\ \ $sorted = [];\n# private array $optimized;\n# \n# public function __construct()\n\ # {\n# if (__CLASS__ === static::class) {\n# $this->optimized = [];\n# }\n# }\n\ # \n# public function dispatch(object $event, ?string $eventName = null): object\n\ # {\n# $eventName ??= $event::class;\n# \n# if (isset($this->optimized)) {\n#\ \ $listeners = $this->optimized[$eventName] ?? (empty($this->listeners[$eventName])\ \ ? [] : $this->optimizeListeners($eventName));\n# } else {\n# $listeners = $this->getListeners($eventName);\n\ # }\n# \n# if ($listeners) {\n# $this->callListeners($listeners, $eventName, $event);\n\ # }\n# \n# return $event;\n# }\n# \n# public function getListeners(?string $eventName\ \ = null): array\n# {\n# if (null !== $eventName) {\n# if (empty($this->listeners[$eventName]))\ \ {\n# return [];\n# }\n# \n# if (!isset($this->sorted[$eventName])) {\n# $this->sortListeners($eventName);\n\ # }\n# \n# return $this->sorted[$eventName];\n# }\n# \n# foreach ($this->listeners\ \ as $eventName => $eventListeners) {\n# if (!isset($this->sorted[$eventName]))\ \ {\n# $this->sortListeners($eventName);\n# }\n# }\n# \n# return array_filter($this->sorted);\n\ # }\n# \n# public function getListenerPriority(string $eventName, callable|array\ \ $listener): ?int\n# {\n# if (empty($this->listeners[$eventName])) {\n# return\ \ null;\n# }\n# \n# if (\\is_array($listener) && isset($listener[0]) && $listener[0]\ \ instanceof \\Closure && 2 >= \\count($listener)) {\n# $listener[0] = $listener[0]();\n\ # $listener[1] ??= '__invoke';\n# }\n# \n# foreach ($this->listeners[$eventName]\ \ as $priority => &$listeners) {\n# foreach ($listeners as &$v) {\n# if ($v !==\ \ $listener && \\is_array($v) && isset($v[0]) && $v[0] instanceof \\Closure &&\ \ 2 >= \\count($v)) {\n# $v[0] = $v[0]();\n# $v[1] ??= '__invoke';\n# }\n# if\ \ ($v === $listener || ($listener instanceof \\Closure && $v == $listener)) {\n\ # return $priority;\n# }\n# }\n# }\n# \n# return null;\n# }\n# \n# public function\ \ hasListeners(?string $eventName = null): bool\n# {\n# if (null !== $eventName)\ \ {\n# return !empty($this->listeners[$eventName]);\n# }\n# \n# foreach ($this->listeners\ \ as $eventListeners) {\n# if ($eventListeners) {\n# return true;\n# }\n# }\n\ # \n# return false;\n# }\n# \n# public function addListener(string $eventName,\ \ callable|array $listener, int $priority = 0): void\n# {\n# $this->listeners[$eventName][$priority][]\ \ = $listener;\n# unset($this->sorted[$eventName], $this->optimized[$eventName]);\n\ # }\n# \n# public function removeListener(string $eventName, callable|array $listener):\ \ void\n# {\n# if (empty($this->listeners[$eventName])) {\n# return;\n# }\n# \n\ # if (\\is_array($listener) && isset($listener[0]) && $listener[0] instanceof\ \ \\Closure && 2 >= \\count($listener)) {\n# $listener[0] = $listener[0]();\n\ # $listener[1] ??= '__invoke';\n# }\n# \n# foreach ($this->listeners[$eventName]\ \ as $priority => &$listeners) {\n# foreach ($listeners as $k => &$v) {\n# if\ \ ($v !== $listener && \\is_array($v) && isset($v[0]) && $v[0] instanceof \\Closure\ \ && 2 >= \\count($v)) {\n# $v[0] = $v[0]();\n# $v[1] ??= '__invoke';\n# }\n#\ \ if ($v === $listener || ($listener instanceof \\Closure && $v == $listener))\ \ {\n# unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]);\n\ # }\n# }\n# \n# if (!$listeners) {\n# unset($this->listeners[$eventName][$priority]);\n\ # }\n# }\n# }\n# \n# public function addSubscriber(EventSubscriberInterface $subscriber):\ \ void\n# {\n# foreach ($subscriber->getSubscribedEvents() as $eventName => $params)\ \ {\n# if (\\is_string($params)) {\n# $this->addListener($eventName, [$subscriber,\ \ $params]);\n# } elseif (\\is_string($params[0])) {\n# $this->addListener($eventName,\ \ [$subscriber, $params[0]], $params[1] ?? 0);\n# } else {\n# foreach ($params\ \ as $listener) {\n# $this->addListener($eventName, [$subscriber, $listener[0]],\ \ $listener[1] ?? 0);\n# }\n# }\n# }\n# }\n# \n# public function removeSubscriber(EventSubscriberInterface\ \ $subscriber): void\n# {\n# foreach ($subscriber->getSubscribedEvents() as $eventName\ \ => $params) {\n# if (\\is_array($params) && \\is_array($params[0])) {\n# foreach\ \ ($params as $listener) {\n# $this->removeListener($eventName, [$subscriber,\ \ $listener[0]]);\n# }\n# } else {\n# $this->removeListener($eventName, [$subscriber,\ \ \\is_string($params) ? $params : $params[0]]);\n# }\n# }\n# }\n# \n# /**\n#\ \ * Triggers the listeners of an event.\n# *\n# * This method can be overridden\ \ to add functionality that is executed\n# * for each listener.\n# *\n# * @param\ \ callable[] $listeners The event listeners\n# * @param string $eventName\ \ The name of the event to dispatch\n# * @param object $event The event\ \ object to pass to the event handlers/listeners" - name: sortListeners visibility: private parameters: - name: eventName comment: '# * Sorts the internal list of listeners for the given event by priority.' - name: optimizeListeners visibility: private parameters: - name: eventName comment: '# * Optimizes the internal list of listeners for the given event by priority.' traits: - Psr\EventDispatcher\StoppableEventInterface - Symfony\Component\EventDispatcher\Debug\WrappedListener interfaces: - EventDispatcherInterface