如何在Laravel自定义Form Request中获取验证错误数据
问题分析与解决办法
问题根源
你遇到的405错误,本质是Laravel默认的验证失败处理逻辑导致的:当Form Request验证不通过时,Laravel会对web请求执行重定向操作,但你的接口是返回JSON的API请求,重定向会用GET方法访问原本只允许POST的路由,因此触发“方法不允许”错误。另外,你控制器里的if ($request->validated())逻辑其实没用——validated()方法在验证失败时会直接抛出异常,根本走不到else分支。
解决办法
办法1:用请求头触发JSON响应
发送POST请求时,带上Accept: application/json请求头,Laravel会自动识别这是JSON请求,验证失败时直接返回包含错误信息的JSON响应,不用改代码。
办法2:重写Form Request的失败处理逻辑
在你的Signin请求类里,添加failedValidation方法,强制返回JSON错误:
<?php namespace App\Http\Requests\Auth; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; class Signin extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get custom messages for validator errors. * * @return array<string, mixed> */ public function messages() { return [ 'email.required' => 'Email field is required.' ]; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'email' => 'required', 'password' => 'required' ]; } // 新增验证失败处理方法 protected function failedValidation(Validator $validator) { throw new HttpResponseException(response()->json([ 'error' => $validator->errors() ], 422)); } }
同时控制器代码可以简化,因为验证通过才会走到这里:
public function signin(Signin $request) { return response()->json(['hello' => 'hi']); }
办法3:确认路由定义正确
检查你的路由是不是用POST方法定义的,比如在routes/api.php里:
Route::post('/signin', [YourController::class, 'signin']);
要是在routes/web.php里定义,也得确保没限制错误的请求方法。
这样修改后,参数不全时就会返回错误信息的JSON,不会再出现405错误了。
内容的提问来源于stack exchange,提问作者Sakib Hasan
相关产品推荐
相关产品推荐

