/** * @return $this */ public function init() { parent::init(); // extension installation event listener $this->addEventListener(Event\Type\System\ExtensionInstall::toType(), function ($event) { return $this->onInstall($event); }); return $this; }
/** * @return void */ public final function dispatch($event) { static $reentered = false; try { // handle internal events if ($event instanceof Event\Type\AbstractInternal || $reentered) { return parent::dispatch($event); } $event->setOriginalTarget($this); $this->bootstrap($event); // dispatch given event to the application if ($event instanceof Event\Type\Http\Request) { $reentered = true; $pkgTarget = $this->getTargetPackage($event); $event = $pkgTarget->dispatch($event); if (!$this->isCli()) { //$this->checkOutputBuffer(); } } else { $event = parent::dispatch($event); } } catch (\Exception $e) { $event->setException($e); $event->setStatus(Event\STATUS_INTERRUPTED); if ($e instanceof Exception\AbstractException && Exception\AbstractException::$nonMaskable) { throw $e; } } if ($event->getStatus() == Event\STATUS_INTERRUPTED) { $excepEvent = Event\Type\System\Exception::create()->setException($event->getException()); $event = parent::dispatch($excepEvent); } $this->finishContractServices(); if ($event instanceof Event\Type\InternalEventInterface) { $event->output(); } return $event; }