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

时间:2015-03-27 15:50:50

标签: php phalcon

我正在尝试抢救在调度任何内容之前发生的异常,并将该错误转发给将显示错误页面的错误控制器。问题是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}

你知道我如何解决这个问题,或者是否有更好的方法来解决这个问题?服务引发了例外。

1 个答案:

答案 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'事件中通知执行的操作。   重定向侦听器或控制器事件中产生的异常   到最新的尝试/捕获。