Verzeichnisstruktur phpBB-3.3.16


Veröffentlicht
27.04.2026

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: 01.05.2026, 11:26 - 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