我正在尝试将类似的内容添加到非微型应用程序中,但我不确定如何在不滚动我自己的 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;
}
}
});
想法?
谢谢!
最佳答案
当然有。您的调度程序必须作为同名服务注入(inject)到您的 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'));
关于php - Phalcon PHP - 将事件管理器附加到非微型应用程序中的路由器,无需滚动我自己的 EventsManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631590/