Phalcon:当在调度之前引发异常时,我如何在beforeException期间转发


Phalcon: How do I forward during beforeException when the exception is raised before dispatching?

我正试图挽救在调度任何内容之前发生的异常,并将该错误转发到错误控制器,该控制器将显示一个漂亮的错误页面。问题是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 ]
        ]);
        …
    });

注意:我在调度循环之前抛出了异常,因为这是我在转发时遇到问题的地方。当调度程序已经调用控制器的操作时,转发工作正常。

以下是异常的堆栈范围:

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}

你知道我该怎么解决吗,或者是否有更好的方法来解决这个问题?异常是由服务引发的。

我认为问题是beforeDispatchLoop在调度器初始化之前。尝试更改为beforeDispatch:

$eventsManager->attach('dispatch:beforeDispatch', function($event, $dispatcher) {
    throw new Exception('Just because.');
});

此外,文档中的这一部分可能适用于:http://docs.phalconphp.com/en/latest/reference/dispatching.html#handling-未找到异常

只有调度程序生成的异常和中生成的异常执行的操作在"beforeException"事件中得到通知。重定向侦听器或控制器事件中产生的异常到最近的尝试/捕获。