yii2中验证布尔字段需用['attr', 'boolean']规则,默认支持10种输入并转为布尔值,但空值转false易误判;严格模式需设strict=>true及truevalue/falsevalue;必填时required必须在boolean之前;复选框未提交时需default设默认值。

在Yii2中验证布尔值字段,比如“是否启用”“是否默认”“是否同意协议”这类开关型输入,必须明确区分true/false语义,不能仅靠空值或字符串"1"/"0"自动转换——否则用户提交"on"、"yes"、"false"等非标准值时会静默失败或误判。
基础布尔验证规则写法
在模型的rules()方法中添加如下规则:
['status', 'boolean']
这行代码会让Yii2使用BooleanValidator校验status属性。它默认接受true、false、1、0、'1'、'0'、'true'、'false'、'on'、'off'共10种输入,并统一转为PHP布尔值。但注意:【空字符串''、null、' '(纯空格)会被转为false,而非验证失败】——这常导致前端未勾选复选框时传空,后端误认为“已禁用”,实际应报错或拒绝。
严格模式:只认true/false,拒绝字符串转换
当业务要求必须由前端明确传递true或false(如API接口),禁止任何字符串映射时,启用strict模式:
['is_agree', 'boolean', 'strict' => true, 'trueValue' => true, 'falseValue' => false]
此时只有PHP原生true和false通过验证,'1'、'on'、1等全部失败。这个配置必须同时指定trueValue和falseValue,否则strict=>true不生效。
自定义布尔可接受值范围
方法一:重定义真/假值映射
['publish', 'boolean', 'trueValue' => 'Y', 'falseValue' => 'N']
这样用户提交'Y'存为true,'N'存为false,其他值(包括'y'、'YES')均验证失败。大小写敏感,若需忽略大小写,得配合filter规则先转大写。
方法二:用in验证器替代(不推荐用于布尔逻辑)
['enabled', 'in', 'range' => [0, 1]]
这仅校验数值是否为0或1,不进行类型转换,也不触发布尔赋值行为——适合仅做取值限制、后续手动处理的场景。但它绕过了BooleanValidator的类型归一化能力,$model->enabled仍是整数而非布尔值。
与required规则配合的正确顺序
第一步:明确字段是否允许为空
若该布尔字段是必填项(例如“用户必须勾选同意协议”),不能只写['agree', 'boolean']——因为boolean验证器本身不检查空值,空字符串仍转为false并算通过。
第二步:叠加required规则,且必须放在boolean之前
['agree', 'required'],
['agree', 'boolean', 'strict' => true]
原因:Yii2按规则数组顺序执行验证。如果先boolean再required,空字符串已被转成false,required看到的是非空布尔值,判定通过;而反过来,required先拦截空值报错,根本不会走到boolean验证环节。
表单中复选框(checkbox)的注意事项
HTML复选框未勾选时默认不提交,$_POST里压根没有该字段键名。Yii2的load()方法遇到缺失字段,会保持模型属性原值(通常是null)。所以必须主动设默认值:
public $is_active = false;
否则即使写了['is_active', 'boolean'],未勾选提交后$model->is_active仍是null,后续逻辑可能出错。若想未勾选时显式设为false,可在scenarios()中为对应场景设置is_active为安全属性,并搭配default验证器:
['is_active', 'default', 'value' => false],
['is_active', 'boolean']











