Laravel 不会遵守状态码
Posted
技术标签:
【中文标题】Laravel 不会遵守状态码【英文标题】:Laravel won't obey status code 【发布时间】:2013-01-20 05:01:32 【问题描述】:我就是看不懂,也不知道去哪里找,因为下面代码的响应状态码总是200,即使我在主响应类中设置为400。
class Api_Controller extends Base_Controller
public function __construct()
parent::__construct();
//header("HTTP/1.0 404 Not Found"); ##> This works
//die();
$test = array('1' => '2');
die(Response::json($test, 400));
我错过了什么?我没有使用任何扩展类,只是默认的......
更新
这是上面Response::json...
的输出:http://pastebin.com/RGcinSdg
如您所见,输出具有已设置的值...但仍出于某种原因返回 200
更新2
var_dump(http_response_code());
的输出总是200
Update3 - 临时修复
我已经激活了Response::json
的扩展版本,并在其中添加了以下行
http_response_code($status);
但我仍然很想知道它为什么不这样做,它应该以何种方式完成
【问题讨论】:
可能在你想设置状态码之前就开始输出了。但是如果你有错误报告,这应该很容易发现。 错误报告已开启...我已经用resonse::json
的输出更新了问题
【参考方案1】:
您不能从控制器构造函数返回响应 - 它不符合 Laravel 中请求生命周期的流程。
有两种方法可以做到这一点。您可以:
a) 设置一个响应过滤器来处理您想要实现的任何功能或 b) 强制控制器 ACTION 返回响应。这将像这样完成:
class Api_Controller extends Base_Controller
public $restful = true;
public function get_index()
return Response::json($test, 400);
它确实有效 - 你只是做错了 :)
【讨论】:
【参考方案2】:如果您忘记了 return 语句,也会出现同样的问题:
Response::json(array(
'error' => true,
'msg' => 'Bad request'
), 403);
代替:
return Response::json(array(
'error' => true,
'msg' => 'Bad request'
), 403);
【讨论】:
【参考方案3】:试试response()->json()
语法。
因此,例如,要从自定义 FormResquest 中标记验证错误,您可以这样做:
/**
* Get validation response for the request.
*
* @param array $messages
* @return \Symfony\Component\HttpFoundation\Response
*/
public function response(array $messages)
return response()->json($messages, 422);
【讨论】:
\Response::json(...)
和 response()->json(...)
是同一个东西;一个使用Facade
,而另一个是函数。不过,这对于较新版本的 Laravel 确实有好处,因为我认为 response()
函数是在 Laravel 5.0(或类似版本)中引入的,并且在 Facades 的文档中被引用。【参考方案4】:
控制器方法总是必须返回响应。但我认为您不能从构造函数返回响应。您需要使用过滤器。
【讨论】:
【参考方案5】:为了让 Google 网站管理员工具满意,我在标题中检测并使用以下内容:
META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"
【讨论】:
以上是关于Laravel 不会遵守状态码的主要内容,如果未能解决你的问题,请参考以下文章
Laravel通过request表单验证类返回封装http状态码
Laravel 5.2 在中止时将 Http 响应状态码设置为 403
Laravel Axios 使用 Vue 失败,状态码 419
PHPUnit:预期状态码 200 但使用 Laravel 收到 419