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

Laravel中如何创建仅接受特定数值的自定义验证规则?

实现指定数值的表单验证规则

针对你的需求,要让grades.*和grades1.*字段仅接受指定的9个数值,这里提供两种直接可行的方案,均不使用“可被5整除”的判断逻辑:

方案一:直接使用in验证规则

这是最简洁的方式,直接把允许的数值列在验证规则里,同时移除原来的lt:2.50限制(因为允许的最大值是3.00)。

修改FormRequest代码

你可以选择数组形式或字符串形式的in规则:

数组形式(更清晰)

先引入Rule类,再更新规则:

use Illuminate\Validation\Rule;

public function rules()
{
    return [
        'user_id' => 'required',
        'app_id' => 'nullable',
        'subjects.*' => 'required|string',
        'subjects1.*' => 'required|string',
        'school_year' => 'required',
        // 更新grades和grades1的验证规则
        'grades.*' => [
            'required',
            'numeric',
            Rule::in(['1.00', '1.25', '1.50', '1.75', '2.00', '2.25', '2.50', '2.75', '3.00'])
        ],
        'grades1.*' => [
            'required',
            'numeric',
            Rule::in(['1.00', '1.25', '1.50', '1.75', '2.00', '2.25', '2.50', '2.75', '3.00'])
        ],
        'units.*' => 'required|integer|min:1',
        'units1.*' => 'required|integer|min:1',
        'term' => 'required',
        'term1' => 'required',
        'total.*' => 'nullable',
        'total1.*' => 'nullable',
        'gwa_1st' => 'required|lte:1.75',
        'gwa_2nd' => 'required|lte:1.75',
        'year_level' => 'required|string',
        'image' => 'required|mimes:jpeg,png,jpg',
        'award_applied' => 'required|string',
        'course_id' => 'required|string'
    ];
}

字符串形式(更简洁)

直接拼接规则字符串:

public function rules()
{
    return [
        // 其他规则保持不变
        'grades.*' => 'required|numeric|in:1.00,1.25,1.50,1.75,2.00,2.25,2.50,2.75,3.00',
        'grades1.*' => 'required|numeric|in:1.00,1.25,1.50,1.75,2.00,2.25,2.50,2.75,3.00',
        // 其他规则保持不变
    ];
}

添加自定义错误提示

在FormRequest类中新增messages方法,让错误提示更友好:

public function messages()
{
    return [
        'grades.*.in' => '成绩必须是1.00、1.25、1.50、1.75、2.00、2.25、2.50、2.75或3.00中的一个',
        'grades1.*.in' => '成绩必须是1.00、1.25、1.50、1.75、2.00、2.25、2.50、2.75或3.00中的一个',
    ];
}

方案二:闭包自定义验证(处理数值精度问题)

如果需要兼容用户输入的数值精度(比如1.2500、1.5这类格式),可以用闭包规则先格式化数值,再判断是否在允许列表中:

修改FormRequest的rules方法

public function rules()
{
    $allowedGrades = ['1.00', '1.25', '1.50', '1.75', '2.00', '2.25', '2.50', '2.75', '3.00'];
    
    return [
        // 其他规则保持不变
        'grades.*' => [
            'required',
            'numeric',
            function ($attribute, $value, $fail) use ($allowedGrades) {
                // 格式化数值为两位小数的字符串
                $formattedValue = number_format((float)$value, 2, '.', '');
                if (!in_array($formattedValue, $allowedGrades)) {
                    $fail("{$attribute}必须是1.00、1.25、1.50、1.75、2.00、2.25、2.50、2.75或3.00中的一个");
                }
            }
        ],
        'grades1.*' => [
            'required',
            'numeric',
            function ($attribute, $value, $fail) use ($allowedGrades) {
                $formattedValue = number_format((float)$value, 2, '.', '');
                if (!in_array($formattedValue, $allowedGrades)) {
                    $fail("{$attribute}必须是1.00、1.25、1.50、1.75、2.00、2.25、2.50、2.75或3.00中的一个");
                }
            }
        ],
        // 其他规则保持不变
    ];
}

控制器代码无需修改

你的Controller中的store方法不需要调整,因为验证逻辑已经在FormRequest中处理完成,只有通过验证的请求才会进入控制器方法。

内容的提问来源于stack exchange,提问作者Sharmae Reyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:40:27