在我的项目中,我创建了运行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获取内容。如何修复?
答案 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();
}