* $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; * } * ); * * * @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); } }