Yii2验证规则:如何让规则同时生效于指定场景与默认场景
解决Yii2验证规则同时支持默认场景和指定单独触发的问题
这其实很容易实现,Yii2的场景验证机制完全能满足你的需求,下面给你两种可行的方案,你可以根据实际情况选择:
方案一:给验证规则指定多个生效场景
直接在规则的on属性里同时包含default(默认场景)和你自定义的run_special_validation场景,这样这条规则就会在两个场景下都生效。
示例代码:
public function rules() { return [ // 这条规则在默认场景和run_special_validation场景都生效 ['your_target_attribute', 'your_validator_class_or_method', 'on' => ['default', 'run_special_validation']], // 其他默认场景的验证规则 ['email', 'required'], ['name', 'string', 'max' => 255], ]; }
使用方式:
- 默认场景触发:直接调用
$model->validate(),这条规则会和其他默认规则一起执行校验。 - 单独触发指定场景:如果只想验证这条规则,可以调用
$model->validate(['your_target_attribute'], 'run_special_validation');如果run_special_validation场景下只有这一条规则,也可以简化为$model->validate(null, 'run_special_validation')。
方案二:自定义场景并保留规则的全局生效
如果你希望这条规则默认在所有场景都生效,同时能通过指定场景单独触发它,可以通过重写scenarios()方法来限定自定义场景的验证范围。
示例代码:
public function scenarios() { $scenarios = parent::scenarios(); // 定义run_special_validation场景仅验证目标属性 $scenarios['run_special_validation'] = ['your_target_attribute']; return $scenarios; } public function rules() { return [ // 不设置on属性,默认在所有场景生效 ['your_target_attribute', 'your_validator_class_or_method'], // 其他默认规则 ['email', 'required'], ]; }
使用方式:
- 默认场景触发:调用
$model->validate()时,这条规则会和其他规则一同生效。 - 单独触发指定场景:调用
$model->validate(null, 'run_special_validation'),此时只会校验your_target_attribute对应的规则,达到单独触发的效果。
两种方案都能完美满足你的需求,方案一适合需要严格限定规则生效场景的情况,方案二更适合希望规则全局生效但又能单独触发的场景。
内容的提问来源于stack exchange,提问作者The Bndr
相关产品推荐
相关产品推荐

