Source of file EventManager.php
Size: 2,489 Bytes - Last Modified: 2017-11-08T13:54:24+00:00
/home/travis/build/bluzphp/framework/src/EventManager/EventManager.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | <?php /** * Bluz Framework Component * * @copyright Bluz PHP Team * @link https://github.com/bluzphp/framework */ declare(strict_types=1); namespace Bluz\EventManager; /** * Event manager * * @package Bluz\EventManager * @link https://github.com/bluzphp/framework/wiki/EventManager */ class EventManager { /** * @var array list of listeners */ protected $listeners = []; /** * Attach callback to event * * @param string $eventName * @param callable $callback * @param integer $priority * * @return EventManager */ public function attach($eventName, $callback, $priority = 1) { if (!isset($this->listeners[$eventName])) { $this->listeners[$eventName] = []; } if (!isset($this->listeners[$eventName][$priority])) { $this->listeners[$eventName][$priority] = []; } $this->listeners[$eventName][$priority][] = $callback; return $this; } /** * Trigger event * * @param string|Event $event * @param string|object $target * @param array|object $params * * @return string|object */ public function trigger($event, $target = null, $params = null) { if (!$event instanceof Event) { $event = new Event($event, $target, $params); } if (false !== strpos($event->getName(), ':')) { $namespace = substr($event->getName(), 0, strpos($event->getName(), ':')); if (isset($this->listeners[$namespace])) { $this->fire($this->listeners[$namespace], $event); } } if (isset($this->listeners[$event->getName()])) { $this->fire($this->listeners[$event->getName()], $event); } return $event->getTarget(); } /** * Fire! * * @param array $listeners * @param Event $event * * @return EventManager */ protected function fire($listeners, $event) { ksort($listeners); foreach ($listeners as $list) { foreach ($list as $listener) { $result = $listener($event); if (null === $result) { // continue; } elseif (false === $result) { break 2; } else { $event->setTarget($result); } } } return $this; } } |