我正在尝试抢救在调度任何内容之前发生的异常,并将该错误转发给将显示错误页面的错误控制器。问题是forward()
在这种情况下什么都不做,不调用错误控制器。
以下代码是附加到调度程序实例的事件的示例:
$eventsManager->attach('dispatch:beforeDispatchLoop', function($event, $dispatcher) {
throw new Exception('Just because.');
});
$eventsManager->attach("dispatch:beforeException", function($event, $dispatcher, $exception) {
$dispatcher->forward([
'module' => 'frontend',
'controller' => 'errors',
'action' => 'show',
'params' => [ 400 ]
]);
…
});
注意:我在分派循环之前抛出异常,因为这是我无法转发的地方。当调度员已经调用控制器的动作时,转发工作正常。
以下是异常的堆栈strace:
exception 'Exception' with message 'Just because.' in /vagrant/application/config/services-web.php:27
Stack trace:
#0 [internal function]: {closure}(Object(Phalcon\Events\Event), Object(Phalcon\Mvc\Dispatcher), NULL)
#1 [internal function]: Phalcon\Events\Manager->fireQueue(Array, Object(Phalcon\Events\Event))
#2 [internal function]: Phalcon\Events\Manager->fire('dispatch:before...', Object(Phalcon\Mvc\Dispatcher))
#3 [internal function]: Phalcon\Dispatcher->dispatch()
#4 /vagrant/public/index.php(24): Phalcon\Mvc\Application->handle()
#5 {main}
你知道我如何解决这个问题,或者是否有更好的方法来解决这个问题?服务引发了例外。
答案 0 :(得分:1)
我认为问题是beforeDispatchLoop在调度程序被初始化之前就已存在。尝试更改为beforeDispatch:
$eventsManager->attach('dispatch:beforeDispatch', function($event, $dispatcher) {
throw new Exception('Just because.');
});
此外,文档中的此部分可能适用:http://docs.phalconphp.com/en/latest/reference/dispatching.html#handling-not-found-exceptions
只有调度员产生的例外和产生的例外 在'beforeException'事件中通知执行的操作。 重定向侦听器或控制器事件中产生的异常 到最新的尝试/捕获。