required验证器默认将0、''、null均判为“未提交”,导致合法值0校验失败;应使用requiredvalue => null限定仅null为缺失,或组合filter/intval预处理。

Yii2 的 required 验证器默认把数字 0、空字符串 ''、null 都当作“未提交”,所以当字段合法值就是 0(比如评分、开关、数量)时,会误判为缺失,导致校验失败。这不是 bug,而是设计逻辑——它检查的是“是否被提交”,不是“是否为空字符串”或“是否为真值”。要让 0 通过验证,有几种稳妥方式:
用 requiredValue => null 显式限定“缺失”的含义
这是最直接的修复方式。它告诉验证器:只有值严格等于 null 才算没填,其他任何值(包括 0、false、'0')都视为已提交。
[['score'], 'required', 'requiredValue' => null]- 注意:
requiredValue不是设置默认值,而是定义“什么才算空” - 适用于字段本身允许
0且不希望额外预处理的场景
先过滤再验证:组合 filter + required
如果字段传入可能是字符串 '0' 或整数 0,且你希望统一转为整型后再判断是否提交,推荐预处理:
[['score'], 'filter', 'filter' => 'intval'][['score'], 'required']- 这样
'0'→0→ 被required接受;而''→0?不行——intval('')返回0,仍会通过。所以更稳妥的是搭配trim或显式判断空字符串 - 若还需排除纯空格等,可加
[['score'], 'trim']在前
避免踩坑:别只改 required 就完事
有些情况光调 required 不够,需同步检查上下游:
- 前端传参是否把
0错写成空字符串或undefined?建议后端日志打出来看原始 POST 值 - 数据库字段是否为
TINYINT(1)类型?PHP 传'0'字符串可能被 MySQL 静默转成0,但模型规则若设了integer,反而会因类型不匹配触发验证失败 - 如果字段还配了
default规则(如['score', 'default', 'value' => 0]),要确认它和required的执行顺序——default在验证前生效,不影响required判定
补充:对布尔开关类字段(如 is_active)的处理
若字段语义是“开启/关闭”,值为 0 或 1,且必须填写:
- 用
[['is_active'], 'required', 'requiredValue' => null] - 再加一条
[['is_active'], 'in', 'range' => [0, 1]]确保取值合法 - 避免只依赖
required,因为required不管内容是否合规,只管“有没有”











