Laravel Request Validation: The given data was invalid

PostStoreRequest.php:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostStoreRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required',
            'content' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'title.required' => '文章标题不能为空',
            'content.required'  => '文章内容不能为空',
        ];
    }

}

PostController.php:

use use App\Http\Requests\PostStoreRequest;

class PostController extends Controller
{
    public function store(PostStoreRequest $request)
    {
        // ...
    }
}

当我验证通过时,一切正常。
但是验证不通过时,返回的信息不是 PostStoreRequest.phpmessages 函数中定义的错误提示信息,而是:

{
    "message": "The given data was invalid.",
    "status_code": 500,
    "debug": {
        "line": 117,
        "file": "/var/www/site/vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php",
        "class": "Illuminate\\Validation\\ValidationException",
        "trace": [
            // ...
        ]
    }
}

不知道哪里出错了。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 17

文件名 PostRequest.php 与 类名 class PostStoreRequest extends FormRequest 不一致

5年前 评论

@青风百里 实际文件名是 PostStoreRequest.php 没错,这里体温我写错了,应该也和文件名没有关系,命名空间和类名都没有问题。

5年前 评论

这个问题我也碰到了,很棘手啊,完全没思路,百度谷歌到的也没靠谱的方案。

5年前 评论

getMessage 是拿不到的,这里捕获到错误后用 errors 方法获取自定义的错误信息

file

5年前 评论

这个问题今天解决了,发生问题的场景是 在API的PUT接口中出现的, 浏览器和postman都不能直接发起PUT请求,必须要使用post方法,然后在请求体中额外自己添加一个_method:put的键值,否则服务器会识别不了数据。
跟踪了validation的代码,发现打印出来的data全是空,也就无法通过request验证了。
但是给出的结果:The given data was invalid实在是有点太坑了,一点都不精确,我的解决方案是,让自己创建的request 继承dingo/api的formrequest,而不是laravel自己的,这时候你会发现得到的错误提示更精确,直接告诉你上传的每个key对应的值都是空。

5年前 评论
Hesunfly

楼上说得对,可以解决这个问题,刚好自己今天也遇到了这个问题,多谢@jingzhognwa

5年前 评论

@Hesunfly "The given data was invalid". 有办法将这个信息转化为中文吗?

5年前 评论
橙子 4年前
Hesunfly

你想要转化中文的话我还不是很清楚,不过我都是直接自己去定义错误消息的,比如说required直接报出不可为空。
你可以直接在request验证类中完成messages()方法就可以的,具体可以看文档的@Wen369367988

4年前 评论

我是post请求也出现这个问题,怎么解决哎

4年前 评论
Hesunfly 4年前

@清歌 非常感谢, 特意注册账号来感谢你 :smile:

4年前 评论

在 exception handler 里处理这个问题是正解,像是 Laravel 特意留给开发者的处理方式。

4年前 评论
    if ($exception instanceof ValidationException){
            $errors = @$exception->validator->errors()->toArray();
            $message = null;
        if (count($errors)) {
            $firstKey = array_keys($errors)[0];
            $message = $errors[$firstKey][0];
        }
        throw new Exception($message,$exception->getCode());
    }
3年前 评论
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
if ($exception instanceof ValidationException) {
      return response(Arr::first(Arr::collapse($exception->errors())));
}
3年前 评论
dylan2021 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!