Laravel不会遵守状态代码

时间:2013-02-05 09:58:04

标签: php json laravel http-status-codes

我无法理解,也不知道在哪里看,因为以下代码的响应状态代码总是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

UPDATE2

var_dump(http_response_code());的输出始终为200

Update3 - 临时修复

我已激活Response::json的扩展版本并向其添加以下行

http_response_code($status);

但我仍然非常想知道它为什么不这样做,应该如何

5 个答案:

答案 0 :(得分:11)

您无法从控制器构造函数返回响应 - 它只是不适合Laravel中请求生命周期的流程。

有两种方法可以做到这一点。你可以:

a)设置一个响应过滤器,用于处理您正在尝试实现的任何功能 b)强制控制器ACTION返回响应。这将是这样做的:

class Api_Controller extends Base_Controller
{
    public $restful = true;

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

它可以工作 - 你只是做错了:)

答案 1 :(得分:3)

如果您忘记返回语句,则会出现同样的问题:

Response::json(array(
   'error' => true,
   'msg' => 'Bad request'
), 403);

而不是:

return Response::json(array(
   'error' => true,
   'msg' => 'Bad request'
), 403);

答案 2 :(得分:1)

尝试使用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);
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

为了让Google网站站长工具保持高兴,我在标题中检测并使用了以下内容:

META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"