skipOnError默认为true,控制验证规则在其他属性验证失败时是否跳过;设为false则强制执行,适用于字段依赖场景,可与on、when配合使用。

在Yii2模型验证中,skipOnError用于控制某个验证规则是否在其他属性验证失败时跳过执行,避免无效验证干扰错误提示或性能损耗。
理解skipOnError的作用场景
当一个模型有多个验证规则,且某些字段之间存在依赖关系(例如:只有邮箱格式正确时,才需要检查该邮箱是否已被注册),这时需用skipOnError防止“邮箱格式错误”和“邮箱已存在”两个错误同时出现,干扰用户判断。
skipOnError默认为true——即只要模型中任一属性验证失败,标有skipOnError的规则就不再执行。
若设为false,则无论其他字段是否出错,该规则都会强制运行。
在rules()中启用skipOnError
在模型类的rules()方法里,为指定验证规则添加'skipOnError' => false键值对。
例如,要求username必须唯一,且不因其他字段(如email)验证失败而跳过:
['username', 'unique', 'skipOnError' => false]
这行代码表示:即使email字段验证失败,username的唯一性检查仍会执行并可能报错。
对比两种配置的实际效果
方法一:默认行为(skipOnError = true)
定义规则:['email', 'email'], ['email', 'unique']。此时第二个unique规则隐式启用skipOnError=true。当email内容为"abc"时,email格式校验失败→unique规则直接跳过→错误列表里只有“Email is not a valid email address.”
方法二:强制执行(skipOnError = false)
定义规则:['email', 'email'], ['email', 'unique', 'skipOnError' => false]。同样输入"abc",email格式校验失败后,unique规则仍会尝试查询数据库→可能触发异常或返回冗余错误。
【跳过执行是默认安全策略,除非业务明确要求跨错误验证,否则不要设为false】
与on场景和when条件的配合使用
skipOnError只影响“是否跳过”,不改变规则触发时机。它可与on、when共存:
第一步:指定仅在特定场景下生效:['status', 'in', 'range' => [0, 1], 'on' => 'update', 'skipOnError' => false]
第二步:进一步加动态条件:['discount', 'number', 'min' => 0, 'when' => function($model) { return $model->type === 'vip'; }, 'skipOnError' => false]
注意:when函数本身会在验证流程中被调用,若其内部访问了尚未通过验证的属性(如未通过required检查的字段),可能得到null或空值——此时逻辑需自行防御。


















