/** * Trigger listeners * * Actual functionality for triggering listeners, to which trigger() delegate. * * @param string $event Event name * @param EventInterface $e * @param null|callable $callback * @return ResponseCollection */ protected function triggerListeners($event, EventInterface $e, $callback = null) { $responses = new ResponseCollection(); $listeners = $this->getListeners($event); // Add shared/wildcard listeners to the list of listeners, // but don't modify the listeners object $sharedListeners = $this->getSharedListeners($event); $sharedWildcardListeners = $this->getSharedListeners('*'); $wildcardListeners = $this->getListeners('*'); if (count($sharedListeners) || count($sharedWildcardListeners) || count($wildcardListeners)) { $listeners = clone $listeners; // Shared listeners on this specific event $this->insertListeners($listeners, $sharedListeners); // Shared wildcard listeners $this->insertListeners($listeners, $sharedWildcardListeners); // Add wildcard listeners $this->insertListeners($listeners, $wildcardListeners); } foreach ($listeners as $listener) { $listenerCallback = $listener->getCallback(); // Trigger the listener's callback, and push its result onto the // response collection $responses->push(call_user_func($listenerCallback, $e)); // If the event was asked to stop propagating, do so if ($e->propagationIsStopped()) { $responses->setStopped(true); break; } // If the result causes our validation callback to return true, // stop propagation if ($callback && call_user_func($callback, $responses->last())) { $responses->setStopped(true); break; } } return $responses; }
/** * Emit handlers matching the current identifier found in the static handler * * @param callback $callback * @param Event $event * @param ResponseCollection $responses * @return ResponseCollection */ protected function triggerStaticHandlers($callback, Event $event, ResponseCollection $responses) { if (!($staticConnections = $this->getStaticConnections())) { return $responses; } $identifiers = (array) $this->identifier; foreach ($identifiers as $id) { if (!($handlers = $staticConnections->getHandlers($id, $event->getName()))) { continue; } foreach ($handlers as $handler) { $responses->push(call_user_func($handler->getCallback(), $event)); if ($event->propagationIsStopped()) { $responses->setStopped(true); break; } if (call_user_func($callback, $responses->last())) { $responses->setStopped(true); break; } } } return $responses; }
/** * Trigger listeners * * Actual functionality for triggering listeners, to which both trigger() and triggerUntil() * delegate. * * @param string $event Event name * @param EventDescription $e * @param callback $callback * @return ResponseCollection */ protected function triggerListeners($event, EventDescription $e, $callback) { $responses = new ResponseCollection; $listeners = clone $this->getListeners($event); foreach ($this->getStaticListeners($event) as $listener) { $priority = $listener->getOption('priority'); if (null === $priority) { $priority = 1; } elseif (is_array($priority)) { // If we have an array, likely using PriorityQueue. Grab first // element of the array, as that's the actual priority. $priority = array_shift($priority); } $listeners->insert($listener, $priority); } if ($listeners->isEmpty()) { return $responses; } foreach ($listeners as $listener) { // If we have an invalid listener, detach it, and move on to the next if (!$listener->isValid()) { $this->detach($listener); continue; } // Trigger the listener's callback, and push its result onto the // response collection $responses->push(call_user_func($listener->getCallback(), $e)); // If the event was asked to stop propagating, do so if ($e->propagationIsStopped()) { $responses->setStopped(true); break; } // If the result causes our validation callback to return true, // stop propagation if (call_user_func($callback, $responses->last())) { $responses->setStopped(true); break; } } return $responses; }
/** * Trigger listeners * * Actual functionality for triggering listeners, to which both trigger() and triggerUntil() * delegate. * * @param string $event Event name * @param EventDescription $e * @param null|callback $callback * @return ResponseCollection */ protected function triggerListeners($event, EventDescription $e, $callback = null) { $responses = new ResponseCollection(); $listeners = $this->getListeners($event); // add static listeners to the list of listeners // but don't modify the listeners object $staticListeners = $this->getStaticListeners($event); if (count($staticListeners)) { $listeners = clone $listeners; foreach ($staticListeners as $listener) { $priority = $listener->getMetadatum('priority'); if (null === $priority) { $priority = 1; } elseif (is_array($priority)) { // If we have an array, likely using PriorityQueue. Grab first // element of the array, as that's the actual priority. $priority = array_shift($priority); } $listeners->insert($listener, $priority); } } if ($listeners->isEmpty()) { return $responses; } foreach ($listeners as $listener) { // Trigger the listener's callback, and push its result onto the // response collection $responses->push(call_user_func($listener->getCallback(), $e)); // If the event was asked to stop propagating, do so if ($e->propagationIsStopped()) { $responses->setStopped(true); break; } // If the result causes our validation callback to return true, // stop propagation if ($callback && call_user_func($callback, $responses->last())) { $responses->setStopped(true); break; } } return $responses; }
/** * Trigger listeners * * Actual functionality for triggering listeners, to which trigger() delegate. * * @param EventInterface $event * @param null|callable $callback * @return ResponseCollection */ protected function triggerListeners(EventInterface $event, callable $callback = null) { $name = $event->getName(); if (empty($name)) { throw new Exception\RuntimeException('Event is missing a name; cannot trigger!'); } // Initial value of stop propagation flag should be false $event->stopPropagation(false); $responses = new ResponseCollection(); foreach ($this->getListenersByEventName($name) as $listener) { $response = $listener($event); $responses->push($response); // If the event was asked to stop propagating, do so if ($event->propagationIsStopped()) { $responses->setStopped(true); break; } // If the result causes our validation callback to return true, // stop propagation if ($callback && $callback($response)) { $responses->setStopped(true); break; } } return $responses; }