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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:54:32