Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/zendframework/zend-eventmanager/src/SharedEventManager.php
Строк: 271
<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace ZendEventManager;

use 
ZendStdlibCallbackHandler;
use 
ZendStdlibPriorityQueue;

/**
 * Shared/contextual EventManager
 *
 * Allows attaching to EMs composed by other classes without having an instance first.
 * The assumption is that the SharedEventManager will be injected into EventManager
 * instances, and then queried for additional listeners when triggering an event.
 */
class SharedEventManager implements
    
SharedEventAggregateAwareInterface,
    
SharedEventManagerInterface
{
    
/**
     * Identifiers with event connections
     * @var array
     */
    
protected $identifiers = array();

    
/**
     * Attach a listener to an event
     *
     * Allows attaching a callback to an event offered by one or more
     * identifying components. As an example, the following connects to the
     * "getAll" event of both an AbstractResource and EntityResource:
     *
     * <code>
     * $sharedEventManager = new SharedEventManager();
     * $sharedEventManager->attach(
     *     array('MyResourceAbstractResource', 'MyResourceEntityResource'),
     *     'getAll',
     *     function ($e) use ($cache) {
     *         if (!$id = $e->getParam('id', false)) {
     *             return;
     *         }
     *         if (!$data = $cache->load(get_class($resource) . '::getOne::' . $id )) {
     *             return;
     *         }
     *         return $data;
     *     }
     * );
     * </code>
     *
     * @param  string|array $id Identifier(s) for event emitting component(s)
     * @param  string $event
     * @param  callable $callback PHP Callback
     * @param  int $priority Priority at which listener should execute
     * @return CallbackHandler|array Either CallbackHandler or array of CallbackHandlers
     */
    
public function attach($id$event$callback$priority 1)
    {
        
$ids = (array) $id;
        
$listeners = array();
        foreach (
$ids as $id) {
            if (!
array_key_exists($id$this->identifiers)) {
                
$this->identifiers[$id] = new EventManager($id);
            }
            
$listeners[] = $this->identifiers[$id]->attach($event$callback$priority);
        }
        if (
count($listeners) > 1) {
            return 
$listeners;
        }
        return 
$listeners[0];
    }

    
/**
     * Attach a listener aggregate
     *
     * Listener aggregates accept an EventManagerInterface instance, and call attachShared()
     * one or more times, typically to attach to multiple events using local
     * methods.
     *
     * @param  SharedListenerAggregateInterface $aggregate
     * @param  int $priority If provided, a suggested priority for the aggregate to use
     * @return mixed return value of {@link ListenerAggregateInterface::attachShared()}
     */
    
public function attachAggregate(SharedListenerAggregateInterface $aggregate$priority 1)
    {
        return 
$aggregate->attachShared($this$priority);
    }

    
/**
     * Detach a listener from an event offered by a given resource
     *
     * @param  string|int $id
     * @param  CallbackHandler $listener
     * @return bool Returns true if event and listener found, and unsubscribed; returns false if either event or listener not found
     */
    
public function detach($idCallbackHandler $listener)
    {
        if (!
array_key_exists($id$this->identifiers)) {
            return 
false;
        }
        return 
$this->identifiers[$id]->detach($listener);
    }

    
/**
     * Detach a listener aggregate
     *
     * Listener aggregates accept an SharedEventManagerInterface instance, and call detachShared()
     * of all previously attached listeners.
     *
     * @param  SharedListenerAggregateInterface $aggregate
     * @return mixed return value of {@link SharedListenerAggregateInterface::detachShared()}
     */
    
public function detachAggregate(SharedListenerAggregateInterface $aggregate)
    {
        return 
$aggregate->detachShared($this);
    }

    
/**
     * Retrieve all registered events for a given resource
     *
     * @param  string|int $id
     * @return array
     */
    
public function getEvents($id)
    {
        if (!
array_key_exists($id$this->identifiers)) {
            
//Check if there are any id wildcards listeners
            
if ('*' != $id && array_key_exists('*'$this->identifiers)) {
                return 
$this->identifiers['*']->getEvents();
            }
            return 
false;
        }
        return 
$this->identifiers[$id]->getEvents();
    }

    
/**
     * Retrieve all listeners for a given identifier and event
     *
     * @param  string|int $id
     * @param  string|int $event
     * @return false|PriorityQueue
     */
    
public function getListeners($id$event)
    {
        if (!
array_key_exists($id$this->identifiers)) {
            return 
false;
        }
        return 
$this->identifiers[$id]->getListeners($event);
    }

    
/**
     * Clear all listeners for a given identifier, optionally for a specific event
     *
     * @param  string|int $id
     * @param  null|string $event
     * @return bool
     */
    
public function clearListeners($id$event null)
    {
        if (!
array_key_exists($id$this->identifiers)) {
            return 
false;
        }

        if (
null === $event) {
            unset(
$this->identifiers[$id]);
            return 
true;
        }

        return 
$this->identifiers[$id]->clearListeners($event);
    }
}
Онлайн: 1
Реклама