Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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;
 }
Example #3
0
    /**
     * 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;
    }
Example #4
0
 /**
  * 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;
 }
Example #5
0
 /**
  * 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;
 }