FormRequest失败验证返回500错误而不是422错误(5.2升级后)

时间:2016-01-06 15:12:27

标签: laravel laravel-5.2

从L5.1更新到L5.2后,我不再收到一个JSON对象作为失败的FormRequest的响应(即在AJAX帖子请求上)。

通常我会收到422回复,如:

[
    email: 'E-mail is invalid',
    firstname: 'Firstname must be at least 2 characters'
]

但现在我收到500错误页面:

500 response page

我确保我的AJAX调用application/jsonAccept标题。

更新

不,我没有手动捕获此异常。我正在使用Laravel提供的默认FormRequest。正如他们在文档中所述:在AJAX请求期间使用validate方法时,Laravel不会生成重定向响应。相反,Laravel会生成包含所有验证错误的JSON响应。此JSON响应将使用422 HTTP状态代码发送。

同样如此:php artisan make:request StoreBlogPostRequesthttps://laravel.com/docs/5.1/validation#form-request-validation

3 个答案:

答案 0 :(得分:5)

@Mattias!

我最近遇到了同样的问题,我浪费了2个多小时试图了解究竟是什么导致了这个问题。在.env文件中禁用调试会导致表单验证显示500,因为FormValidator抛出ValidationException(并且未处理)。这个问题的解决方案是: 打开 app \ Exceptions \ Handler.php

private function handleExceptions($e)
    {
       // Add anywhere in this method the following code
       // It does what the FormValidator does.

        if($e instanceof ValidationException) {

            return redirect()->back()->withErrors($e->validator->getMessageBag()->toArray());
        }

        return response()->view('errors.500', [], 500);
    }

答案 1 :(得分:4)

要重申其他人所说的内容,您很可能在项目中修改了app/Exceptions/Handler.php,其中有一些代码阻止您看到您希望的结果。

  

所有异常都由App \ Exceptions \ Handler类处理。该类包含两个方法:report和render。

仔细检查app/Exceptions/Handler.php以及https://laravel.com/docs/5.2/errors#the-exception-handler处有关异常处理程序的文档,以确保按照您的意图处理异常。

答案 2 :(得分:0)

我使用 Laravel 5.7 遇到了同样的问题。

如果您阅读 /storage/logs/laravel-yyyy-mm-dd.log 文件,则会发现错误。就我而言,发生此错误是因为我在 Controller 中链接 StoreLocation 请求时忘记了一个步骤:

日志中的错误:

[2018-12-13 09:48:09] local.ERROR: Class App\Requests\StoreLocation does not exist

非常清楚,我开始写代码之前没有先喝咖啡!

解决方案:

use App\Http\Requests\StoreLocation;

我添加了正确的路径StoreLocation.php类。解决此问题后,一切恢复正常并开始发送422响应。

PS1:要获取日志,请确保打开调试模式:将 APP_DEBUG = true 添加到.env文件

PS2:日志文件将最新条目存储在底部