我正试图将这样的东西添加到非微型应用程序中,但我不确定如何在不推出自己的EventsManager的情况下实现这一点。有没有办法引用Phalcon的默认EventsManager?
$eventsManager->attach("dispatch", function($event, $dispatcher, $exception) {
if ($event->getType() == 'beforeException') {
switch ($exception->getCode()) {
case PhalconDispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case PhalconDispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward(array(
'controller' => 'errors',
'action' => 'show404'
));
return false;
}
}
});
想法?
谢谢!
当然有。您的调度器必须作为具有相同名称的服务注入到DI中。如果您的$eventsManager
是PhalconDIInjectable
:的实例
$this->dispatcher->forward(…);
$this->di->get('dispatcher')->forward(…);
如果不是:
DI::getDefault()->get('dispatcher')->forward(…);
编辑:
是的,从文档中还不太清楚是否有共享的事件管理器,我看到的所有示例都只显示了新创建的实例的使用情况。看看Di/FactoryDefault的代码,似乎有一个同名的服务。您可以使用与上面相同的语法来获取它。
DI::getDefault()->get('eventsManager')->attach('dispatch', …);
整个事情应该是这样的,并且必须在您配置DI之后在某个地方进行设置。
$di->get('eventsManager')->attach("dispatch:beforeException", function($event, $dispatcher, $exception) {
switch ($exception->getCode()) {
case PhalconDispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case PhalconDispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward(array(
'controller' => 'errors',
'action' => 'show404'
));
return false;
}
});
$di->get('dispatcher')->setEventsManager($di->get('eventsManager'));