Laravel - 如何在控制器中设置HTTP响应状态码

8

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

这是我的测试控制器函数的代码:

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

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

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

curl -I http://localhost/

为什么它在控制器中不起作用,但在路由调用中却可以?

我相信作为一个新手,我肯定有些地方理解有误,但即使以下代码在路由中可以工作,在控制器中却无法:

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

我做错了什么?


1
我不想重定向,我想加载一个特定的视图,并让它响应一个特定的http_response_code。 - climbd
我不想重定向,我只想设置状态码。 - climbd
1
复制你的代码,给了我201。干净的Laravel 5.6安装。你确定你的路由指向正确的控制器和方法吗?https://laravel.com/docs/5.6/responses#view-responses。 - Marius Engen Haugen
是的,我确定。你尝试从控制器内部还是路由中尝试了吗?它在路由中运行良好,但在控制器中不行(虽然控制器将返回正确的视图,但不带正确的HTTP响应/状态代码)。我还使用了全新安装的Laravel 5.6,并尝试了我的第一个控制器。(OS X 10.13.1 with PHP 7.1.7) - climbd
如果在控制器中使用 dd('die'),会发生什么?会返回 500 吗? - Marius Engen Haugen
显示剩余3条评论
1个回答

25

解决方案

您可以使用在此提到的 这里。您需要返回像这样的响应:

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

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

注意 setStatusCode($integer) 方法。

替代方案

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

将标头附加到响应中

请记住,大多数响应方法都是可链接的,可以流畅地构建响应实例。例如,您可以使用 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
@climbd 不,我刚刚测试了一下,它返回了正确的状态码(顺便说一句,我使用 Postman 进行了测试)。 - Kenny Horna
我打算下载Postman并尝试一下,但我不确定为什么使用curl -I从路由和控制器进行测试时会得到不同的结果。 - climbd
@climbd 尝试执行 curl -I http://the_route_of_your_request,我已经执行过了,它显示了正确的状态码。 - Kenny Horna
我已经做了。你提供的所有建议都是正确的。所以谢谢你的帮助和审核。问题出在 Laravel 外面。我一直在尝试不同的方法来将 WordPress 与 Laravel 集成,比如尝试 Corcel、WordPress 的本地安装等等。那么我留下的 WordPress 本地安装正好妨碍了它。一旦我移除了 WordPress 代码,就可以正常工作了。然后我成功缩小它到 WP 的 template-loader.php 文件,我推测这个文件正在加载和输出空白数据,导致 HTTP 标头被过早地发送。 - climbd
@climbd 很高兴能够帮助。 - Kenny Horna

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