Laravel表单验证数字时,size、between、max不起作用的解决方法

在laravel的实际开发时,表单验证有时会来验证数字的大小。
在laravel的表单验证中,与数字大小的判断有关的有:size、between、min、max

between:min,max

验证字段值的大小是否介于指定的 minmax 之间。字符串、数值或是文件大小的计算方式和 size 规则相同。

max:value

字段值必须小于或等于 value 。字符串、数值或是文件大小的计算方式和 size 规则相同。

min:value

字段值必须大于或等于 value。字符串、数值或是文件大小的计算方式和 size 规则相同。

size:value

验证字段值的大小是否符合指定的 value 值。对于字符串来说,value 为字符数。对于数字来说,value 为某个整数值。对文件来说,size 对应的是文件大小(单位 kb )。

可以得知,这些验证规则都是基于size的。那么我们在项目中使用between:

然后再次提交表单,我们希望这个字段的值在2~4之间。提交之后,却发现毫无作用,数据为-1时,仍然正常保存。甚至在把between设置为 3~5 时会提醒:experiment type 必须介于 3 - 4 个字符之间。

我们来查看关于表单验证的源码:src/Illuminate/Validation/Validator.php


可以看到主要的验证方法是 validate($attribute, $rule),继续查看该方法:

前边几行代码是用来过滤参数的,可以注意到这里拼接了一个方法 $method = "validate{$rule}",而当我们使用between方法来验证时,该方法拼接为 validateBetween ,继续在这个php类中寻找该方法:

接下来查看 getSize($attribute, $value) 方法:
可以看到,如果要判断的值为数字而且这个$hasNumeric 为真时,才会真正来判断这个值的大小,其他情况下,当值为数组时判断数组的大小,当值为字符串时判断字符串的长度。那么我们再来看一下这个hasRule 方法和这个验证类的$numericRules属性到底是什么:
$numericRules 属性

hasRule 方法

可以看出,当验证的规则中有 NumericInteger 时,laravel的表单验证才会来验证数字的大小,默认情况下是判断字符串的长度的。

所以,当需要验证表单数据中数字的大小时,在验证规则中一定要加入 NumericInteger 其一,size、between、max、min这些验证才会起作用。

你可能感兴趣的:(Laravel表单验证数字时,size、between、max不起作用的解决方法)