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
是否存在?如果是这样,键 email
和 min
是否存在?
非常感谢 Clément Baconnier。你是对的,因为我没有使用视图,我删除了资源文件夹和 lang 文件夹,我很傻。再次感谢。
我记得 Taylor Otwell 的一条推文提议将 lang 文件夹上移一级正是出于这个原因。我相信,如果你移动它,它已经可以工作了。所以resources/lang/en
会变成lang/en
我已发表我的评论作为结束问题的答案
【参考方案1】:
正如我的评论:
-
确保文件
resources/lang/en/validation.php
存在
如果存在,请确保密钥 email
和 min
存在
附注:
您可以在顶层移动文件夹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 调用未正确返回验证错误的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Web API:返回 401/未授权响应的正确方法