在yii2中需通过rules()的on参数指定场景、重写scenarios()声明自定义场景、控制器中设置$model->scenario才能启用对应验证规则。

在Yii2中为不同场景设置独立验证规则时,需要通过验证规则的on参数精确控制该规则仅在指定场景下生效,否则会跳过执行。
定义场景并绑定验证规则
在模型类的rules()方法中,为某条验证规则添加'on' => '场景名'选项。例如:['status', 'in', 'range' => [0, 1], 'on' => 'admin']表示只有当模型场景为admin时,才校验status是否为0或1。
这一步必须在规则数组中显式声明,不加on则该规则默认对所有场景生效;加了但场景名拼错或未触发对应场景,规则就完全不运行。
设置模型当前场景
在控制器或业务逻辑中,给模型对象赋值$model->scenario = 'admin';,才能激活带on => 'admin'的规则。
注意:必须在调用validate()或save()前设置,否则on参数形同虚设。如果模型继承自yii\base\Model且未重写scenarios(),默认只支持default场景;若需自定义场景如admin,必须在scenarios()中显式声明,否则scenario = 'admin'会被静默忽略→【必须重写scenarios()并返回包含'admin'的数组】。
同时匹配多个场景
方法一:用数组形式指定多个场景名:'on' => ['admin', 'api']。
方法二:用字符串连接多个场景,用空格分隔:'on' => 'admin api'(效果等同于数组写法)。
方法三:排除指定场景,用except替代on:'except' => ['guest'],表示除guest外所有场景都启用该规则。
验证规则与场景的典型配合路径
第一步:在模型中定义scenarios(),返回允许的场景列表,例如:return ['default' => ['name', 'email'], 'admin' => ['name', 'email', 'status']];
第二步:在rules()中添加带on的规则,如['status', 'required', 'on' => 'admin'];
第三步:控制器中设置$model->scenario = 'admin';;
第四步:调用$model->validate();,此时status字段才会被纳入校验流程。











