我试图将这样的内容添加到非微型应用程序中,但我不确定如何在不滚动自己的EventsManager的情况下这样做。有没有办法获得对Phalcon的默认EventsManager的引用?
$eventsManager->attach("dispatch", function($event, $dispatcher, $exception) {
if ($event->getType() == 'beforeException') {
switch ($exception->getCode()) {
case Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward(array(
'controller' => 'errors',
'action' => 'show404'
));
return false;
}
}
});
思想?
谢谢!
答案 0 :(得分:2)
当然有。您的调度员必须作为具有相同名称的服务注入您的DI。如果您的$eventsManager
是Phalcon\DI\Injectable
的实例:
$this->dispatcher->forward(…);
$this->di->get('dispatcher')->forward(…);
如果不是:
DI::getDefault()->get('dispatcher')->forward(…);
修改强>
是的,从文档中不太清楚存在共享事件管理器,我看到的所有示例都只显示了新创建的实例的用法。看the code of the Di/FactoryDefault,似乎有一个同名的服务。您可以使用与上面相同的语法来获取它。
DI::getDefault()->get('eventsManager')->attach('dispatch', …);
整个事情应该是这样的,并且必须在配置DI之后在某处设置。
$di->get('eventsManager')->attach("dispatch:beforeException", function($event, $dispatcher, $exception) {
switch ($exception->getCode()) {
case Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward(array(
'controller' => 'errors',
'action' => 'show404'
));
return false;
}
});
$di->get('dispatcher')->setEventsManager($di->get('eventsManager'));