【问题标题】:Laravel won't obey status codeLaravel 不会遵守状态码
【发布时间】: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的输出更新了问题

标签: php json laravel http-status-codes


【解决方案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"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-13
          • 1970-01-01
          • 2014-08-31
          • 2015-09-26
          • 2015-06-23
          • 2016-08-29
          • 2023-03-13
          相关资源
          最近更新 更多