Laravel 8 API 调用未正确返回验证错误

Posted

技术标签:

【中文标题】Laravel 8 API 调用未正确返回验证错误【英文标题】:Laravel 8 API call not returning validation errors correctly 【发布时间】:2022-01-08 17:22:14 【问题描述】:

我正在使用 Postman 对我的 API 路由进行以下调用,一切正常,直到我强制验证错误。返回的错误对象不包含验证错误的完整列表,而是只有这样的内容:

"message":"The given data was invalid.","errors":"email":["validation.email"],"password":["validation.min.string"]

我想要的是它应该返回完整的错误消息而不是“validation.min.string”。

这是我的控制器方法:

public function __invoke(Request $request)
    
        $credentials = $request->validate([
            'email' => 'required|email|max:255',
            'password' => 'required|min:8'
        ]);

        $credentials['status'] = true;

        if (Auth::attempt($credentials)) 
            return response()->json('login success!');
         else 
            return response()->json('login failure!');
        
    

这是邮递员请求的屏幕截图

Screenshot here

【问题讨论】:

你使用的是哪个 laravel 版本? 文件resources/lang/en/validation.php 是否存在?如果是这样,键 emailmin 是否存在? 非常感谢 Clément Baconnier。你是对的,因为我没有使用视图,我删除了资源文件夹和 lang 文件夹,我很傻。再次感谢。 我记得 Taylor Otwell 的一条推文提议将 lang 文件夹上移一级正是出于这个原因。我相信,如果你移动它,它已经可以工作了。所以resources/lang/en 会变成lang/en 我已发表我的评论作为结束问题的答案 【参考方案1】:

正如我的评论:

    确保文件resources/lang/en/validation.php存在 如果存在,请确保密钥 emailmin 存在

附注:

您可以在顶层移动文件夹lang,它仍然可以工作。 所以resources/lang/en 会变成lang/en

【讨论】:

我移动了它并且它有效,我不知道。谢谢。【参考方案2】:

创建新的 FormRequest 类并覆盖下面的方法

protected function failedValidation(Validator $validator) 
        $response = [
            'status' => false,
            'message' => $validator->errors()->first(),
        ];
        throw new HttpResponseException(response()->json($response, 422));
    

或使用此代码:

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
   // your validation rules
])->stopOnFirstFailure(true);

$validator->validate();

它将只返回单个验证消息

【讨论】:

以上是关于Laravel 8 API 调用未正确返回验证错误的主要内容,如果未能解决你的问题,请参考以下文章

laravel 8.x 测试 api 返回错误的状态码

如何使用 Laravel API 身份验证返回未授权

ASP.NET Web API:返回 401/未授权响应的正确方法

如何在 laravel 8 中为 API 返回验证规则和消息作为 JSON

Laravel在进行表单验证时,错误信息未返回

Laravel 8.65 验证错误消息和旧值未显示在 Blade 文件中