为什么`-> setStatusCode(422)更改响应Laravel

时间:2019-06-27 15:11:45

标签: laravel http

所以基本上,我一直在使用laravel开发简单的上传系统。 但是现在的问题是请求验证。我正在尝试检查上传是否符合某些要求。如果不符合要求,

  • 发送http状态代码422(表示不可处理的实体),并且
  • 发送验证程序错误,例如Title field is required

问题是我无法同时做到两者

如果我使用此代码(与->setStatusCode(422)一起使用):

if (isset($request->validator) && $request->validator->fails()) 
{




        return back()
    ->withInput()
    ->setStatusCode(422)
    ->withErrors($request->validator->errors());
        //return back()->withError($request->validator->errors())->setStatusCode(422);


}

它发送正确的状态码,但不发送错误,它仅显示以下内容:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url=http://localhost:8000/dashboard/posts/create/?type=image" />

        <title>Redirecting to http://localhost:8000/dashboard/posts/create/?type=image</title>
    </head>
    <body>
        Redirecting to <a href="http://localhost:8000/dashboard/posts/create/?type=image">http://localhost:8000/dashboard/posts/create/?type=image</a>.
    </body>
</html>

.....什么意思。

但是,如果我在代码中省略了->setStatusCode(422)(或将其注释掉),则为:

if (isset($request->validator) && $request->validator->fails()) 
{




        return back()
    ->withInput()
    //->setStatusCode(422)
    ->withErrors($request->validator->errors());
        //return back()->withError($request->validator->errors())->setStatusCode(422);


}

它发送了正确的验证器错误,但发送了一个200(确定)http状态代码,这不是我想要的。

请提供任何建议。

1 个答案:

答案 0 :(得分:2)

back()返回重定向响应。重定向响应的代码状态为300到399(通常为301或302)。如果响应状态在300到399之间,则浏览器将仅遵循重定向。

您应该做的是根本不更改状态代码,因为验证错误发生在X页上,并且您重定向回了Y页。如果Y页没有引起任何错误,那么您不应显示过时的状态代码。发生错误,但现在您在其他地方。显示错误为时已晚。

一种替代方法是根本不重定向,而是在此处显示带有正确状态代码的错误页面,并带有一个链接(可以选择使用户返回)。