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
相关产品推荐
相关产品推荐

