Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

EventDispatcher.php

Zuletzt modifiziert: 02.04.2025, 15:02 - Dateigröße: 7.02 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\EventDispatcher;
013   
014  /**
015   * The EventDispatcherInterface is the central point of Symfony's event listener system.
016   *
017   * Listeners are registered on the manager and events are dispatched through the
018   * manager.
019   *
020   * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
021   * @author Jonathan Wage <jonwage@gmail.com>
022   * @author Roman Borschel <roman@code-factory.org>
023   * @author Bernhard Schussek <bschussek@gmail.com>
024   * @author Fabien Potencier <fabien@symfony.com>
025   * @author Jordi Boggiano <j.boggiano@seld.be>
026   * @author Jordan Alliot <jordan.alliot@gmail.com>
027   * @author Nicolas Grekas <p@tchwork.com>
028   */
029  class EventDispatcher implements EventDispatcherInterface
030  {
031      private $listeners = [];
032      private $sorted = [];
033   
034      /**
035       * {@inheritdoc}
036       */
037      public function dispatch($eventName, Event $event = null)
038      {
039          if (null === $event) {
040              $event = new Event();
041          }
042   
043          if ($listeners = $this->getListeners($eventName)) {
044              $this->doDispatch($listeners, $eventName, $event);
045          }
046   
047          return $event;
048      }
049   
050      /**
051       * {@inheritdoc}
052       */
053      public function getListeners($eventName = null)
054      {
055          if (null !== $eventName) {
056              if (empty($this->listeners[$eventName])) {
057                  return [];
058              }
059   
060              if (!isset($this->sorted[$eventName])) {
061                  $this->sortListeners($eventName);
062              }
063   
064              return $this->sorted[$eventName];
065          }
066   
067          foreach ($this->listeners as $eventName => $eventListeners) {
068              if (!isset($this->sorted[$eventName])) {
069                  $this->sortListeners($eventName);
070              }
071          }
072   
073          return array_filter($this->sorted);
074      }
075   
076      /**
077       * {@inheritdoc}
078       */
079      public function getListenerPriority($eventName, $listener)
080      {
081          if (empty($this->listeners[$eventName])) {
082              return null;
083          }
084   
085          if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
086              $listener[0] = $listener[0]();
087          }
088   
089          foreach ($this->listeners[$eventName] as $priority => $listeners) {
090              foreach ($listeners as $k => $v) {
091                  if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
092                      $v[0] = $v[0]();
093                      $this->listeners[$eventName][$priority][$k] = $v;
094                  }
095                  if ($v === $listener) {
096                      return $priority;
097                  }
098              }
099          }
100   
101          return null;
102      }
103   
104      /**
105       * {@inheritdoc}
106       */
107      public function hasListeners($eventName = null)
108      {
109          if (null !== $eventName) {
110              return !empty($this->listeners[$eventName]);
111          }
112   
113          foreach ($this->listeners as $eventListeners) {
114              if ($eventListeners) {
115                  return true;
116              }
117          }
118   
119          return false;
120      }
121   
122      /**
123       * {@inheritdoc}
124       */
125      public function addListener($eventName, $listener, $priority = 0)
126      {
127          $this->listeners[$eventName][$priority][] = $listener;
128          unset($this->sorted[$eventName]);
129      }
130   
131      /**
132       * {@inheritdoc}
133       */
134      public function removeListener($eventName, $listener)
135      {
136          if (empty($this->listeners[$eventName])) {
137              return;
138          }
139   
140          if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
141              $listener[0] = $listener[0]();
142          }
143   
144          foreach ($this->listeners[$eventName] as $priority => $listeners) {
145              foreach ($listeners as $k => $v) {
146                  if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
147                      $v[0] = $v[0]();
148                  }
149                  if ($v === $listener) {
150                      unset($listeners[$k], $this->sorted[$eventName]);
151                  } else {
152                      $listeners[$k] = $v;
153                  }
154              }
155   
156              if ($listeners) {
157                  $this->listeners[$eventName][$priority] = $listeners;
158              } else {
159                  unset($this->listeners[$eventName][$priority]);
160              }
161          }
162      }
163   
164      /**
165       * {@inheritdoc}
166       */
167      public function addSubscriber(EventSubscriberInterface $subscriber)
168      {
169          foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
170              if (\is_string($params)) {
171                  $this->addListener($eventName, [$subscriber, $params]);
172              } elseif (\is_string($params[0])) {
173                  $this->addListener($eventName, [$subscriber, $params[0]], isset($params[1]) ? $params[1] : 0);
174              } else {
175                  foreach ($params as $listener) {
176                      $this->addListener($eventName, [$subscriber, $listener[0]], isset($listener[1]) ? $listener[1] : 0);
177                  }
178              }
179          }
180      }
181   
182      /**
183       * {@inheritdoc}
184       */
185      public function removeSubscriber(EventSubscriberInterface $subscriber)
186      {
187          foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
188              if (\is_array($params) && \is_array($params[0])) {
189                  foreach ($params as $listener) {
190                      $this->removeListener($eventName, [$subscriber, $listener[0]]);
191                  }
192              } else {
193                  $this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]);
194              }
195          }
196      }
197   
198      /**
199       * Triggers the listeners of an event.
200       *
201       * This method can be overridden to add functionality that is executed
202       * for each listener.
203       *
204       * @param callable[] $listeners The event listeners
205       * @param string     $eventName The name of the event to dispatch
206       * @param Event      $event     The event object to pass to the event handlers/listeners
207       */
208      protected function doDispatch($listeners, $eventName, Event $event)
209      {
210          foreach ($listeners as $listener) {
211              if ($event->isPropagationStopped()) {
212                  break;
213              }
214              \call_user_func($listener, $event, $eventName, $this);
215          }
216      }
217   
218      /**
219       * Sorts the internal list of listeners for the given event by priority.
220       *
221       * @param string $eventName The name of the event
222       */
223      private function sortListeners($eventName)
224      {
225          krsort($this->listeners[$eventName]);
226          $this->sorted[$eventName] = [];
227   
228          foreach ($this->listeners[$eventName] as $priority => $listeners) {
229              foreach ($listeners as $k => $listener) {
230                  if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
231                      $listener[0] = $listener[0]();
232                      $this->listeners[$eventName][$priority][$k] = $listener;
233                  }
234                  $this->sorted[$eventName][] = $listener;
235              }
236          }
237      }
238  }
239