PHP Classes

File: vendor/symfony/event-dispatcher/EventDispatcher.php

Recommend this page to a friend!
  Classes of Renato Lucena   PHP Pokemon Script   vendor/symfony/event-dispatcher/EventDispatcher.php   Download  
File: vendor/symfony/event-dispatcher/EventDispatcher.php
Role: Class source
Content type: text/plain
Description: Class source
Class: PHP Pokemon Script
Provides an API to manage a database of Pokemons
Author: By
Last change:
Date: 6 years ago
Size: 7,195 bytes
 

Contents

Class file image Download
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * The EventDispatcherInterface is the central point of Symfony's event listener system.
 *
 * Listeners are registered on the manager and events are dispatched through the
 * manager.
 *
 * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
 * @author Jonathan Wage <jonwage@gmail.com>
 * @author Roman Borschel <roman@code-factory.org>
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @author Jordan Alliot <jordan.alliot@gmail.com>
 * @author Nicolas Grekas <p@tchwork.com>
 */
class EventDispatcher implements EventDispatcherInterface
{
    private
$listeners = array();
    private
$sorted = array();

   
/**
     * {@inheritdoc}
     */
   
public function dispatch($eventName, Event $event = null)
    {
        if (
null === $event) {
           
$event = new Event();
        }

        if (
$listeners = $this->getListeners($eventName)) {
           
$this->doDispatch($listeners, $eventName, $event);
        }

        return
$event;
    }

   
/**
     * {@inheritdoc}
     */
   
public function getListeners($eventName = null)
    {
        if (
null !== $eventName) {
            if (empty(
$this->listeners[$eventName])) {
                return array();
            }

            if (!isset(
$this->sorted[$eventName])) {
               
$this->sortListeners($eventName);
            }

            return
$this->sorted[$eventName];
        }

        foreach (
$this->listeners as $eventName => $eventListeners) {
            if (!isset(
$this->sorted[$eventName])) {
               
$this->sortListeners($eventName);
            }
        }

        return
array_filter($this->sorted);
    }

   
/**
     * {@inheritdoc}
     */
   
public function getListenerPriority($eventName, $listener)
    {
        if (empty(
$this->listeners[$eventName])) {
            return;
        }

        if (
is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
           
$listener[0] = $listener[0]();
        }

        foreach (
$this->listeners[$eventName] as $priority => $listeners) {
            foreach (
$listeners as $k => $v) {
                if (
$v !== $listener && is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
                   
$v[0] = $v[0]();
                   
$this->listeners[$eventName][$priority][$k] = $v;
                }
                if (
$v === $listener) {
                    return
$priority;
                }
            }
        }
    }

   
/**
     * {@inheritdoc}
     */
   
public function hasListeners($eventName = null)
    {
        if (
null !== $eventName) {
            return !empty(
$this->listeners[$eventName]);
        }

        foreach (
$this->listeners as $eventListeners) {
            if (
$eventListeners) {
                return
true;
            }
        }

        return
false;
    }

   
/**
     * {@inheritdoc}
     */
   
public function addListener($eventName, $listener, $priority = 0)
    {
       
$this->listeners[$eventName][$priority][] = $listener;
        unset(
$this->sorted[$eventName]);
    }

   
/**
     * {@inheritdoc}
     */
   
public function removeListener($eventName, $listener)
    {
        if (empty(
$this->listeners[$eventName])) {
            return;
        }

        if (
is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
           
$listener[0] = $listener[0]();
        }

        foreach (
$this->listeners[$eventName] as $priority => $listeners) {
            foreach (
$listeners as $k => $v) {
                if (
$v !== $listener && is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) {
                   
$v[0] = $v[0]();
                }
                if (
$v === $listener) {
                    unset(
$listeners[$k], $this->sorted[$eventName]);
                } else {
                   
$listeners[$k] = $v;
                }
            }

            if (
$listeners) {
               
$this->listeners[$eventName][$priority] = $listeners;
            } else {
                unset(
$this->listeners[$eventName][$priority]);
            }
        }
    }

   
/**
     * {@inheritdoc}
     */
   
public function addSubscriber(EventSubscriberInterface $subscriber)
    {
        foreach (
$subscriber->getSubscribedEvents() as $eventName => $params) {
            if (
is_string($params)) {
               
$this->addListener($eventName, array($subscriber, $params));
            } elseif (
is_string($params[0])) {
               
$this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
            } else {
                foreach (
$params as $listener) {
                   
$this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
                }
            }
        }
    }

   
/**
     * {@inheritdoc}
     */
   
public function removeSubscriber(EventSubscriberInterface $subscriber)
    {
        foreach (
$subscriber->getSubscribedEvents() as $eventName => $params) {
            if (
is_array($params) && is_array($params[0])) {
                foreach (
$params as $listener) {
                   
$this->removeListener($eventName, array($subscriber, $listener[0]));
                }
            } else {
               
$this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0]));
            }
        }
    }

   
/**
     * Triggers the listeners of an event.
     *
     * This method can be overridden to add functionality that is executed
     * for each listener.
     *
     * @param callable[] $listeners The event listeners
     * @param string $eventName The name of the event to dispatch
     * @param Event $event The event object to pass to the event handlers/listeners
     */
   
protected function doDispatch($listeners, $eventName, Event $event)
    {
        foreach (
$listeners as $listener) {
            if (
$event->isPropagationStopped()) {
                break;
            }
           
call_user_func($listener, $event, $eventName, $this);
        }
    }

   
/**
     * Sorts the internal list of listeners for the given event by priority.
     *
     * @param string $eventName The name of the event
     */
   
private function sortListeners($eventName)
    {
       
krsort($this->listeners[$eventName]);
       
$this->sorted[$eventName] = array();

        foreach (
$this->listeners[$eventName] as $priority => $listeners) {
            foreach (
$listeners as $k => $listener) {
                if (
is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) {
                   
$listener[0] = $listener[0]();
                   
$this->listeners[$eventName][$priority][$k] = $listener;
                }
               
$this->sorted[$eventName][] = $listener;
            }
        }
    }
}