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

SharedEventManager.php

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


001  <?php
002  /**
003   * Zend Framework (http://framework.zend.com/)
004   *
005   * @link      http://github.com/zendframework/zend-eventmanager for the canonical source repository
006   * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
007   * @license   https://github.com/zendframework/zend-eventmanager/blob/master/LICENSE.md
008   */
009   
010  namespace Zend\EventManager;
011   
012  /**
013   * Shared/contextual EventManager
014   *
015   * Allows attaching to EMs composed by other classes without having an instance first.
016   * The assumption is that the SharedEventManager will be injected into EventManager
017   * instances, and then queried for additional listeners when triggering an event.
018   */
019  class SharedEventManager implements SharedEventManagerInterface
020  {
021      /**
022       * Identifiers with event connections
023       * @var array
024       */
025      protected $identifiers = [];
026   
027      /**
028       * Attach a listener to an event emitted by components with specific identifiers.
029       *
030       * Allows attaching a listener to an event offered by an identifying
031       * components. As an example, the following connects to the "getAll" event
032       * of both an AbstractResource and EntityResource:
033       *
034       * <code>
035       * $sharedEventManager = new SharedEventManager();
036       * foreach (['My\Resource\AbstractResource', 'My\Resource\EntityResource'] as $identifier) {
037       *     $sharedEventManager->attach(
038       *         $identifier,
039       *         'getAll',
040       *         function ($e) use ($cache) {
041       *             if (!$id = $e->getParam('id', false)) {
042       *                 return;
043       *             }
044       *             if (!$data = $cache->load(get_class($resource) . '::getOne::' . $id )) {
045       *                 return;
046       *             }
047       *             return $data;
048       *         }
049       *     );
050       * }
051       * </code>
052       *
053       * @param  string $identifier Identifier for event emitting component.
054       * @param  string $event
055       * @param  callable $listener Listener that will handle the event.
056       * @param  int $priority Priority at which listener should execute
057       * @return void
058       * @throws Exception\InvalidArgumentException for invalid identifier arguments.
059       * @throws Exception\InvalidArgumentException for invalid event arguments.
060       */
061      public function attach($identifier, $event, callable $listener, $priority = 1)
062      {
063          if (! is_string($identifier) || empty($identifier)) {
064              throw new Exception\InvalidArgumentException(sprintf(
065                  'Invalid identifier provided; must be a string; received "%s"',
066                  (is_object($identifier) ? get_class($identifier) : gettype($identifier))
067              ));
068          }
069   
070          if (! is_string($event) || empty($event)) {
071              throw new Exception\InvalidArgumentException(sprintf(
072                  'Invalid event provided; must be a non-empty string; received "%s"',
073                  (is_object($event) ? get_class($event) : gettype($event))
074              ));
075          }
076   
077          $this->identifiers[$identifier][$event][(int) $priority][] = $listener;
078      }
079   
080      /**
081       * @inheritDoc
082       */
083      public function detach(callable $listener, $identifier = null, $eventName = null, $force = false)
084      {
085          // No identifier or wildcard identifier: loop through all identifiers and detach
086          if (null === $identifier || ('*' === $identifier && ! $force)) {
087              foreach (array_keys($this->identifiers) as $identifier) {
088                  $this->detach($listener, $identifier, $eventName, true);
089              }
090              return;
091          }
092   
093          if (! is_string($identifier) || empty($identifier)) {
094              throw new Exception\InvalidArgumentException(sprintf(
095                  'Invalid identifier provided; must be a string, received %s',
096                  (is_object($identifier) ? get_class($identifier) : gettype($identifier))
097              ));
098          }
099   
100          // Do we have any listeners on the provided identifier?
101          if (! isset($this->identifiers[$identifier])) {
102              return;
103          }
104   
105          if (null === $eventName || ('*' === $eventName && ! $force)) {
106              foreach (array_keys($this->identifiers[$identifier]) as $eventName) {
107                  $this->detach($listener, $identifier, $eventName, true);
108              }
109              return;
110          }
111   
112          if (! is_string($eventName) || empty($eventName)) {
113              throw new Exception\InvalidArgumentException(sprintf(
114                  'Invalid event name provided; must be a string, received %s',
115                  (is_object($eventName) ? get_class($eventName) : gettype($eventName))
116              ));
117          }
118   
119          if (! isset($this->identifiers[$identifier][$eventName])) {
120              return;
121          }
122   
123          foreach ($this->identifiers[$identifier][$eventName] as $priority => $listeners) {
124              foreach ($listeners as $index => $evaluatedListener) {
125                  if ($evaluatedListener !== $listener) {
126                      continue;
127                  }
128   
129                  // Found the listener; remove it.
130                  unset($this->identifiers[$identifier][$eventName][$priority][$index]);
131   
132                  // Is the priority queue empty?
133                  if (empty($this->identifiers[$identifier][$eventName][$priority])) {
134                      unset($this->identifiers[$identifier][$eventName][$priority]);
135                      break;
136                  }
137              }
138   
139              // Is the event queue empty?
140              if (empty($this->identifiers[$identifier][$eventName])) {
141                  unset($this->identifiers[$identifier][$eventName]);
142                  break;
143              }
144          }
145   
146          // Is the identifier queue now empty? Remove it.
147          if (empty($this->identifiers[$identifier])) {
148              unset($this->identifiers[$identifier]);
149          }
150      }
151   
152      /**
153       * Retrieve all listeners for a given identifier and event
154       *
155       * @param  string[] $identifiers
156       * @param  string   $eventName
157       * @return array[]
158       * @throws Exception\InvalidArgumentException
159       */
160      public function getListeners(array $identifiers, $eventName)
161      {
162          if ('*' === $eventName || ! is_string($eventName) || empty($eventName)) {
163              throw new Exception\InvalidArgumentException(sprintf(
164                  'Event name passed to %s must be a non-empty, non-wildcard string',
165                  __METHOD__
166              ));
167          }
168   
169          $returnListeners = [];
170   
171          foreach ($identifiers as $identifier) {
172              if ('*' === $identifier || ! is_string($identifier) || empty($identifier)) {
173                  throw new Exception\InvalidArgumentException(sprintf(
174                      'Identifier names passed to %s must be non-empty, non-wildcard strings',
175                      __METHOD__
176                  ));
177              }
178   
179              if (isset($this->identifiers[$identifier])) {
180                  $listenersByIdentifier = $this->identifiers[$identifier];
181                  if (isset($listenersByIdentifier[$eventName])) {
182                      foreach ($listenersByIdentifier[$eventName] as $priority => $listeners) {
183                          $returnListeners[$priority][] = $listeners;
184                      }
185                  }
186                  if (isset($listenersByIdentifier['*'])) {
187                      foreach ($listenersByIdentifier['*'] as $priority => $listeners) {
188                          $returnListeners[$priority][] = $listeners;
189                      }
190                  }
191              }
192          }
193   
194          if (isset($this->identifiers['*'])) {
195              $wildcardIdentifier = $this->identifiers['*'];
196              if (isset($wildcardIdentifier[$eventName])) {
197                  foreach ($wildcardIdentifier[$eventName] as $priority => $listeners) {
198                      $returnListeners[$priority][] = $listeners;
199                  }
200              }
201              if (isset($wildcardIdentifier['*'])) {
202                  foreach ($wildcardIdentifier['*'] as $priority => $listeners) {
203                      $returnListeners[$priority][] = $listeners;
204                  }
205              }
206          }
207   
208          foreach ($returnListeners as $priority => $listOfListeners) {
209              $returnListeners[$priority] = array_merge(...$listOfListeners);
210          }
211   
212          return $returnListeners;
213      }
214   
215      /**
216       * @inheritDoc
217       */
218      public function clearListeners($identifier, $eventName = null)
219      {
220          if (! isset($this->identifiers[$identifier])) {
221              return false;
222          }
223   
224          if (null === $eventName) {
225              unset($this->identifiers[$identifier]);
226              return;
227          }
228   
229          if (! isset($this->identifiers[$identifier][$eventName])) {
230              return;
231          }
232   
233          unset($this->identifiers[$identifier][$eventName]);
234      }
235  }
236