Laravel不遵循状态码

6

我真的无法理解,也不知道还能去哪里寻找答案,因为下面这段代码的响应状态码总是200,即使我在主要的Response类中将它设置为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 更新3 - 临时解决方法
我已经激活了一个扩展版本的Response::json并添加了以下行:
http_response_code($status);

但我仍然很想知道为什么它没有按照应该的方式执行。

可能输出在您想设置状态码之前已经开始了...但是如果您启用了错误报告,这应该很容易发现。 - mishu
错误报告已开启...我已更新问题并附上了response::json的输出。 - Alex
5个回答

12

在Laravel中,控制器构造函数无法返回响应 - 它与请求生命周期的流程不符。

有两种方法可以解决这个问题。你可以选择:

a) 设置一个响应过滤器来处理你想要实现的功能,或者 b) 强制控制器动作返回一个响应。这可以通过以下方式实现:

class Api_Controller extends Base_Controller
{
    public $restful = true;

    public function get_index()
    {
        return Response::json($test, 400);
    }
}

它确实有效 - 你只是做错了 :)


3
如果您忘记了 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更常用。 - Tim Lewis

0
为了让Google网站管理员工具保持正常,我在头部检测并使用以下内容:
META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"

0

控制器方法总是需要返回响应。但我认为你不能从构造函数中返回响应。你需要使用过滤器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接