Laravel 8设置多条验证规则时返回404错误如何解决
问题成因
- 你使用数组形式定义多条验证规则的写法是Laravel官方推荐的正确写法,
type字段的正则规则本身也没有语法错误,触发404的核心原因是Laravel表单验证失败后的默认响应逻辑和你的请求场景不匹配:- 当
type字段的取值不符合正则限定的范围时,验证逻辑判定不通过,Laravel会自动触发重定向逻辑返回上一页,同时把验证错误存入Session。 - 如果你当前是发起接口请求(没有对应Web页面),请求没有携带
Accept: application/json请求头,Laravel会默认按照Web表单请求处理,执行重定向。而你的路由一般仅定义了POST方法,重定向默认是GET请求,找不到对应GET路由就会返回404。 - 如果是Web表单场景,出现该问题是因为验证失败后重定向的来源页路由不存在/已修改。
- 当
修复方案
场景1:接口请求场景
- 方案1:请求接口时主动添加
Accept: application/json请求头,Laravel识别为JSON请求后,验证失败会自动返回422状态码+错误信息的JSON响应,不会触发重定向,自然不会出现404。 - 方案2:如果要全局处理接口验证失败的响应逻辑,可以在定义
rules方法的表单请求类中重写failedValidation方法,自定义失败响应:
use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; // 放到你的表单请求类中 protected function failedValidation(Validator $validator) { throw new HttpResponseException(response()->json([ 'code' => 422, 'msg' => '参数错误', 'errors' => $validator->errors() ], 422)); }
场景2:Web表单请求场景
- 方案1:确保提交表单的来源页路由存在且可正常访问,验证失败后Laravel会重定向回该页面,你可以在页面上通过
$errors变量打印错误提示给用户:
@if ($errors->has('type')) <span class="invalid-feedback" role="alert"> <strong>{{ $errors->first('type') }}</strong> </span> @endif
- 方案2:如果不想走默认重定向逻辑,也可以和接口场景一样重写
failedValidation方法,自定义你需要的响应逻辑。
额外优化建议
你的type字段验证可以不用手写正则,用Laravel内置的in规则更简洁易读,还可以直接支持不区分大小写的校验:
use Illuminate\Validation\Rule; public function rules() { return [ 'name' => 'required', 'type' => [ 'required', Rule::in(['firstname', 'lastname', 'custom'])->ignoreCase() ] ]; }
内容的提问来源于stack exchange,提问作者jeyGey
相关产品推荐
相关产品推荐

