Source of file SharedEventManager.php
Size: 5,735 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/EventManager/SharedEventManager.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 | <?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 Zend\EventManager; use Zend\Stdlib\CallbackHandler; use Zend\Stdlib\PriorityQueue; /** * 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('My\Resource\AbstractResource', 'My\Resource\EntityResource'), * '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($id, CallbackHandler $listener) { if (!array_key_exists($id, $this->identifiers)) { return false; } return $this->identifiers[$id]->detach($listener); } /** * Detach a listener aggregate * * Listener aggregates accept a 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); } } |