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

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也会失败?可能有以下几个排查方向:

二、可能的问题原因及解决方法

  1. 输入值的格式异常
    有些浏览器在处理type="number"的输入时,可能会提交非纯数字的格式(比如带空格、隐藏字符),或者你的请求处理环节不小心修改了输入值。你可以在验证前先打印一下请求中的odds值,确认它确实是-100这个纯数字:

    dd(request()->get('odds'));
    
  2. 缓存导致规则未更新
    有时候Laravel的配置缓存会导致验证规则没有生效,你可以清理一下缓存试试:

    php artisan config:clear
    php artisan cache:clear
    
  3. integer规则的局限性
    你的规则里用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:52:59