如何修复Laravel中BenSampo/laravel-enum的enum_value验证报错
Laravel BenSampo枚举校验返回无效值修复方案
问题根因
- 核心触发点:
BenSampo/laravel-enum提供的enum_value验证规则默认开启严格类型校验,HTTP表单提交的所有参数均为字符串类型,若UserType枚举定义的枚举值为整数类型(如管理员=1、作者=2),字符串格式的"2"和整数格式的2类型不匹配,直接判定为无效值。 - 配套问题1:未给
role.enum_value规则配置自定义错误提示,因此触发扩展包默认的The value you have entered is invalid.文案。 - 配套问题2:重写的
failedValidation方法不符合Laravel表单请求规范,直接返回Alert组件不会生成携带校验错误的重定向响应。 - 配套问题3:Blade模板中超级管理员场景下的只读角色输入框,错误绑定了
@error('name')的校验样式,role字段校验出错时无法正常高亮提示。 - 配套问题4:角色下拉框的默认选项未设置空value,未选择角色时会提交
Select Role字符串,必然触发校验失败。
分步修复
1. 修正表单请求类逻辑
引入正确的类依赖,关闭enum_value的严格类型校验,补充错误提示,修正验证失败的响应逻辑:
<?php namespace App\Http\Requests; use App\Enums\UserType; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; use Illuminate\Validation\Rules\Password; use Illuminate\Validation\ValidationException; use RealRashid\SweetAlert\Facades\Alert; class UserPostRequest extends FormRequest { public function rules() { return [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users,email', // 第二个参数传false关闭严格类型校验,适配表单提交的字符串参数 'role' => ['required', 'enum_value:' . UserType::class . ',false'], 'password' => ['required', 'string', 'confirmed', Password::min(8) ->mixedCase() ->letters() ->numbers() ->symbols() ->uncompromised()], ]; } public function messages() { return [ 'name.required' => '用户姓名为必填项', 'role.required' => '用户角色为必填项', 'role.enum_value' => '所选用户角色无效', 'email.required' => '用户邮箱为必填项', 'email.unique' => '该邮箱已被占用,请更换其他邮箱', 'password.required'=> '用户密码为必填项', ]; } protected function failedValidation(Validator $validator) { Alert::error('新增数据失败', '请检查表单填写内容是否正确'); // 按框架规范抛出验证异常,自动携带错误信息重定向回表单页 throw new ValidationException($validator); } }
注意:必须确认文件头部正确引入
UserType枚举类,避免类名解析错误。
2. 修正Blade模板渲染逻辑
修正错误的校验绑定,给下拉默认选项加空值,补充旧值回显逻辑:
<div class="form-group"> <label for="role">角色</label> @if(isset(Auth::user()->role)) {{-- 超级管理员场景:固定创建作者角色账号 --}} @if(Auth::user()->role === 1) <input type="text" class="form-control @error('role') is-invalid @enderror" id="role" placeholder="作者" name="role" value="2" required autocomplete="role" readonly > @else <select class="form-select @error('role') is-invalid @enderror" name="role" id="roleCreate"> {{-- 默认选项设置空value,避免提交选项文本 --}} <option value="" selected>请选择角色</option> @foreach ($arrUserType as $status=>$value) <option value="{{ $value }}" @selected(old('role') == $value)>{{ $status }}</option> @endforeach </select> @endif @endif @error('role') <div class="invalid-feedback">{{ $message }}</div> @enderror </div>
3. 确认枚举定义规范
检查app/Enums/UserType.php的定义,确保枚举值和前端传递的参数匹配,参考示例:
<?php namespace App\Enums; use BenSampo\Enum\Enum; final class UserType extends Enum { const ADMINISTRATOR = 1; const WRITER = 2; }
4. 生效验证
修改完成后执行php artisan config:clear清除配置缓存,再提交表单即可正常通过校验。如果仍有报错,可临时在规则方法前打印dd($this->input('role'), UserType::getValues()),对比提交值和枚举允许值是否匹配。
内容的提问来源于stack exchange,提问作者Marc Jamal
相关产品推荐
相关产品推荐

