Laravel 11中digits_between验证规则对负整数值不生效的问题排查
Laravel 11中digits_between验证规则对负整数值不生效的问题排查
我来帮你分析这个问题,核心原因是你可能误解了digits_between规则的工作逻辑,同时结合你的场景还有几个需要注意的点:
一、digits_between规则的真实逻辑
Laravel的digits_between规则计算的是去掉负号后的纯数字位数,而不是输入内容的总字符长度。举个例子:
- 输入
-100,去掉负号后是100,纯数字位数是3,符合你设置的3-70范围,理论上应该通过验证 - 输入
-10,去掉负号后是10,纯数字位数是2,小于3,所以会被拒绝,这是符合规则预期的
那为什么你输入-100也会失败?可能有以下几个排查方向:
二、可能的问题原因及解决方法
输入值的格式异常
有些浏览器在处理type="number"的输入时,可能会提交非纯数字的格式(比如带空格、隐藏字符),或者你的请求处理环节不小心修改了输入值。你可以在验证前先打印一下请求中的odds值,确认它确实是-100这个纯数字:dd(request()->get('odds'));缓存导致规则未更新
有时候Laravel的配置缓存会导致验证规则没有生效,你可以清理一下缓存试试:php artisan config:clear php artisan cache:clearinteger规则的局限性
你的规则里用了integer,但要注意PHP的整数有长度限制(最大是19位左右),如果你的业务需要支持到70位的数字,integer规则会直接失效——因为70位的数字已经远超PHP整数的存储范围,会被转换成浮点数,导致验证失败。这种情况下,你应该把integer换成numeric,同时确保输入以字符串形式处理(可以把input的type改成text,或者在请求中强制转换为字符串)。
三、如果你的需求是包含负号的总字符长度
如果你其实是想验证输入的总字符数(包括负号)在3-70之间,那digits_between就不适用了,应该改用字符串长度验证:
'odds' => ['numeric', 'string', 'min:3', 'max:70'],
这种情况下,-100的总字符数是4,符合3-70的范围,会正常通过验证。
备注:内容来源于stack exchange,提问作者Antman
相关产品推荐
相关产品推荐

