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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
SharedEventManager.php
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