Phalcon 调度程序转发无效

Phalcon dispatcher forwarding having no effect

我将一个组件配置为 beforeDispatch 侦听器。该组件检查表单是否已发布,然后检查 CSRF 令牌是否已正确发送。如果不是,它应该转发到一个特殊的 CSRF 通知页面。我特别想做一个转发而不是重定向,这样用户就可以选择报告他们访问了哪个页面。

这是我的代码:

public function beforeDispatch(\Phalcon\Events\Event $Event,\Phalcon\Mvc\Dispatcher $Dispatcher){
    if($this->request->isPost()){
        if(!$this->checkToken()){
            echo 'before';
            $Dispatcher->forward(['controller'=>'index','action'=>'csrf']);
            echo 'after';
            exit();
        }
    }
}

我得到的只是一个显示 "beforeafter" 的页面。如果我把那些 echo 去掉,我只会得到一个空白页。我可以手动访问 /index/csrf/ 并显示我想要的页面。

为什么请求没有被转发?这是在调度循环之外吗?

您已编码:

exit();

?

我不确定您是否可以在此处使用转发,因为调度程序尚不知道控制器和操作是否存在于调度循环中。 https://docs.phalconphp.com/en/3.2/dispatcher#dispatch-loop

但我认为您可以拦截和控制控制器 class 和调度程序应该使用的操作。

$dispatcher->setModuleName(<your module nam if you have one>);
$dispatcher->setNamespaceName(<your controller class>);
$dispatcher->setActionName(<your action name>);

查看 dispatch loop

上的文档