在我的控制器中,我检查一个条件,看看是否允许用户做某事。如果检查失败,我想将403发送回浏览器。我怎么在Cakephp中做到这一点?
答案 0 :(得分:39)
编辑 - 这个问题很老,涵盖了CakePHP框架的不同版本。以下是每个答案适用的版本的摘要。不要忘记对最有帮助的解决方案进行投票。
编辑#2 - Mark37添加了CakePHP 2.x的more detailed answer。
编辑#3 - 为CakePHP添加了解决方案。 (2018年5月:CakePHP 3.5进行了一些功能重命名,solution by Roberto仍然有效。)
通过查看上一条评论中的相关API code,您似乎可以调用Controller::header($status)来输出没有重定向的标头。在您的情况下,最有可能正确使用:
$this->header('HTTP/1.1 403 Forbidden');
答案 1 :(得分:13)
$this->response->statusCode(403);
当Cake准备好发送响应时,将设置状态代码。 CakeResponse :: send()期望发送状态代码和消息,所以在我的测试中我认为我的使用header()
被覆盖了。使用$this->header('HTTP/1.1 400 Bad Request')
也不起作用,因为Cake期望对$this->header
的任何调用在冒号ex $this->header('Location: ...')
答案 2 :(得分:13)
在CakePHP 2中,preferred method是throw an exception:
throw new ForbiddenException();
答案 3 :(得分:10)
我在这里添加了两分钱,因为我不觉得这些答案中的任何一个都像我希望的那样彻底地覆盖了这个主题(至少对于Cake 2.x而言)。
如果要抛出错误状态,请使用异常类(如其他答案中所述):
throw new BadRequestException(); // 400 Bad Request
// Or customize the code...
throw new BadRequestException('Custom error message', 405); // 405 Method Not Allowed
有趣的事实:即使是通过ExceptionRenderer
类的RESTful调用,Cake也会自动执行一些神奇的错误渲染。更有趣的是,它基于状态代码,而不是Exception
可能被抛出的事实,因此如果您将状态代码设置为>即使您不想要它们,您自己也可能会收到400错误消息。
如果要返回REST JSON / XML端点的特定状态代码,请利用新的CakeResponse
对象,同时确保添加特殊的_serialize
变量或“ ll最终会出现'view not found'错误,因为cake将尝试查找呈现JSON / XML的视图。 (这是设计的 - 请参阅JsonView
/ XmlView
类。)
$this->response->setStatus(201); // 201 Created
$this->set('_serialize', array()); // Value must be something other than null
最后,如果您想为定期呈现的页面发送非200状态,您可以使用setStatus()
方法,而不是之前的答案中提到的其他内容:
$this->response->setStatus(201);
更新:
$this->response->setStatus('code');
不再可用。使用
$this->response->statusCode('code');
答案 4 :(得分:7)
重新审视这个问题,并阅读Adriano对我之前回答的评论(关于将用户重定向到友好页面),我提出了一个新的解决方案。
在控制器中,您可以致电$this->cakeError('error404')
以生成友好的404页面。这可以通过在“app/views/errors/error404.ctp
”创建文件来自定义(与其他错误一样)。
仔细查看code for cakeError
后,我的建议是尝试通过“ErrorHandler
”或(可能更优选)“{{1}创建文件来扩展Cake app/error.php
}}”。
app/app_error.php
的代码(模仿error404
code)可能如下所示:
error403
您 也可以通过创建“class AppError extends ErrorHandler {
function error403($params) {
extract($params, EXTR_OVERWRITE);
$this->error(array(
'code' => '403',
'name' => 'Forbidden',
'message' => sprintf(__("Access was forbidden to the requested address %s on this server.", true), $url, $message)));
$this->_stop();
}
}
”为此错误提供自定义视图。以下是error404 view的修改版本:
app/views/errors/error403.ctp
答案 5 :(得分:6)
有关CakePHP 3.x的注释似乎缺失,所以要使这个线程完整:
对于CakePHP 3.x使用:
$response = $this->response->withStatus(403);
return $response;
对于CakePHP 3.3.x之前的版本,您可以使用与CakePHP 2.x相同的样式:
$this->response->statusCode('code');
请注意,直接使用PHP函数也可以(http_response_code(403); die();
),但使用response object似乎是预期的方法。
答案 6 :(得分:3)
也许in this section of the cakephp manual可以帮助你。
重定向(字符串$ url,整数$ status, boolean $ exit)
您将使用的流量控制方法 最常见的是redirect()。这种方法 获取表单中的第一个参数 CakePHP相对URL的。当一个用户 已经成功下了订单,你 可能希望将它们重定向到 收据屏幕。第二个参数 redirect()允许你定义一个 伴随的HTTP状态代码 重定向。您可能想要使用301 (永久移动)或303(见 其他),取决于的性质 重定向。
该方法将在之后发出exit() 重定向除非你设置第三个 参数为false。
答案 7 :(得分:1)
您可以将cakephp response
用于自定义消息:
$this->response->header('HTTP/1.0 201', 'custom message');
$this->response->send();
答案 8 :(得分:1)
自CakePHP 3.6起,情况又发生了变化:
立即使用
$this->setResponse($this->response->withStatus(403) );
return $this->response; // use this line also
代替
$response = $this->response->withStatus(403);
https://api.cakephp.org/3.7/class-Cake.Controller.Controller.html#_setResponse
答案 9 :(得分:-1)
核心PHP link代码可在cakePHP中使用。
header('HTTP/1.1 403 Forbidden');