You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8设置多条验证规则时返回404错误如何解决

问题成因

  1. 你使用数组形式定义多条验证规则的写法是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:57:04