【问题标题】:Laravel - How to set HTTP response status code from ControllerLaravel - 如何从控制器设置 HTTP 响应状态码
【发布时间】:2018-02-20 02:36:25
【问题描述】:

我是 laravel 的新手,并且成功地将用户从控制器引导到适当的视图,但在某些情况下,我想设置一个 http 状态代码,但无论我做什么,它总是返回一个 200 的响应代码发送。

这是我的测试控制器功能的代码:

public function index()
{
    $data=array();

    return response()->view('layouts.default', $data, 201);
}

如果我在路由中使用相同的代码,它将返回正确的 http 状态代码,正如我在命令行中使用 curl -I 调用页面时看到的那样。

curl -I http://localhost/

是否有它在控制器中不起作用但在路由调用中起作用的原因?

我确定我只是作为新手误解了一些东西,但即使是以下代码也适用于路由而不是控制器:

public function index()
{
    abort(404);
}

我做错了什么?

【问题讨论】:

  • 我不想重定向,我想加载一个特定的视图,但让它响应一个特定的 http_response_code。
  • 我不想做重定向。我只想设置状态码。
  • 我已经更新了我的答案。
  • 复制你的代码,给了我 201。清理 Laravel 5.6 安装。您确定您的路线指向正确的控制器和方法吗? laravel.com/docs/5.6/responses#view-responses.
  • 是的。我很乐观。您是否从控制器中尝试过?还是路线?它可以从路由正常工作,但不能从控制器(尽管控制器将返回正确的视图,只是没有正确的 http 响应/状态代码。我还使用全新安装的 laravel 5.6 并使用我的第一个控制器。 (OS X 10.13.1 和 PHP 7.1.7)

标签: php laravel laravel-5 controller http-status-codes


【解决方案1】:

解决方案

您可以使用提到的here。您将需要返回这样的响应:

public function index()
{
    $data = ['your', 'data'];

    return response()->view('layouts.default', $data)->setStatusCode(404); 
}   //                                                ^^^^^^^^^^^^^^^^^^^

注意setStatusCode($integer) 方法。

另类

您可以在返回视图时设置附加标头以指定附加数据,如documentation 所述:

将标题附加到响应

请记住,大多数响应方法 是可链接的,允许流畅地构建响应 实例。例如,您可以使用 header 方法添加一个系列 在将响应发送回用户之前,响应的标头数量:

return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

【讨论】:

  • 谢谢,我试过 return response()->view('layouts.default', $data)->setStatusCode(404);同样,当我从 web.php 文件中的路由中调用它时它也可以工作,但是如果我移动它以便此代码从控制器内运行,它在各个方面都可以正常工作,除了 http 状态代码在执行时返回 200控制器。
  • @climbd 不,我刚刚对其进行了测试,它返回了正确的状态代码(顺便说一句,我使用 Postman 对其进行了测试)
  • 我要下载邮递员并尝试一下,但我不确定为什么使用 curl -I 从路由与控制器进行测试时会得到不同的结果。
  • @climbd 尝试做curl -I http://the_route_of_your_request,我已经做到了,它显示了正确的状态码。
  • 我做到了。你建议的一切都是正确的。因此,感谢您的帮助和健全性检查。问题来自laravel之外。通过尝试不同的方法,corcel,wordpress 的本地安装等,我一直在尝试将 wordpress 与 laravel 集成的不同方法。好吧,我留下的 wordpress 的本地安装正在妨碍我。一旦我删除了 wordpress 代码,它就可以正常工作了。然后我能够将其缩小到 WP 的 template-loader.php 文件,我认为该文件正在加载和输出空白数据,导致 HTTP 标头过早发送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2016-11-21
  • 2021-07-21
  • 2015-04-20
  • 2019-09-19
  • 2019-06-08
相关资源
最近更新 更多