PhalconPHP - 初始化()中的重定向

时间:2016-05-31 16:59:10

标签: php phalcon

在我的项目中,我创建了运行ajax请求的AjaxController。 我想用户输入由ajax使用的url获取404错误。 在AjaxController.php中我有:

public function initialize() {
    if (!$this->request->isAjax()) {
        return $this->response->redirect('error/show404');
    }
}

(当然我有带有show404Action的ErrorController)

它不起作用。当我在浏览器中输入example.com/ajax时,我从AjaxController中的IndexAction获取内容。如何修复?

2 个答案:

答案 0 :(得分:3)

请尝试在beforeExecuteRoute()中执行相同的操作。正如其名称所示,Phalcon的initialize()被设计为初始化事物。您可以使用调度程序在那里调度,但不应重定向。

您可以查看部分文档here。专栏“可以停止运作吗?”如果可以返回响应对象以完成请求,或者false停止计算其他方法并编译视图。

一个值得珍惜的事情是beforeExecuteRoute()每次都会在调用操作之前执行,因此如果您在操作之间转发,可能会多次触发。

public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher)
{
    if (!$this->request->isAjax()) {
        return $this->response->redirect('error/show404');
    }
}

答案 1 :(得分:0)

我建议通过Dispatcher将用户转发到404页面。通过这种方式,URL将保留,您将根据SEO规则执行所有操作。

public function initialize() {
    if (!$this->request->isAjax()) {
        $this->dispatcher->forward(['controller' => 'error', 'action' => 'show404']);
    }
}

在初始化中进行重定向也不是一个好主意。来自Phalcon的更多信息:https://forum.phalconphp.com/discussion/3216/redirect-initialize-beforeexecuteroute-redirect-to-initalize-and

添加我的404方法以防有人需要它。它演示了正确的标题处理(再次用于SEO目的)

// 404
public function error404Action()
{
    $this->response->setStatusCode(404, 'Not Found');
    $this->view->pick(['templates/error-404']);
    $this->response->send();
}