Laravel自定义Request验证不生效,无法返回自定义错误信息求助
看起来你遇到的问题是FormRequest验证失败时,Laravel没有返回你定义的自定义错误信息,而是直接跳转到了首页。这是Laravel默认的验证失败行为导致的,针对你的场景,我们可以从以下几个方面排查和解决:
1. 强制FormRequest返回JSON格式错误
Laravel的FormRequest默认会根据请求类型决定验证失败后的行为:如果是浏览器请求(非AJAX/API),会重定向回原页面;如果是API请求(带有Accept: application/json头或AJAX请求),才会返回JSON错误。
如果你希望无论请求类型如何,都返回JSON格式的自定义错误信息,可以在你的CarRequest类中重写failedValidation方法:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; class CarRequest extends FormRequest { // 原有的authorize()、rules()、messages()方法保持不变... /** * 重写验证失败后的处理逻辑 * * @param Validator $validator * @return void * @throws HttpResponseException */ protected function failedValidation(Validator $validator) { throw new HttpResponseException( response()->json([ 'message' => 'Validation errors occurred', 'errors' => $validator->errors() // 这里会包含你自定义的错误信息 ], 422) ); } }
这样无论前端发送的是什么类型的请求,验证失败时都会返回包含你自定义错误信息的JSON响应,状态码为422(验证错误的标准HTTP状态码)。
2. 确保前端请求正确设置请求头
如果你希望依赖Laravel默认的API请求判断逻辑,需要确保前端在发送请求时设置了以下请求头之一:
Accept: application/json:告诉服务器你期望接收JSON格式的响应X-Requested-With: XMLHttpRequest:标记请求为AJAX请求
当Laravel检测到这两个请求头中的任意一个时,验证失败后会自动返回JSON格式的错误信息,而不会进行重定向。
3. 修复控制器中的一处低级错误
顺便注意到你的CarController的show方法中有一个明显的错误:你使用了School::with(['images'])->find($id),但应该是Car::with(['images'])->find($id),这个错误会导致查询失败,建议及时修正:
public function show($id) { $car = Car::with(['images'])->find($id); // 把School改成Car if (!$car) { return response()->json(['message' => 'No Car found'], 404); } return response()->json($car, 200); }
总结
最直接的解决方案是重写CarRequest的failedValidation方法,强制返回JSON错误;同时检查前端请求头是否符合API请求的要求,另外别忘了修复控制器中的查询模型错误。
内容的提问来源于stack exchange,提问作者Alex Al

