▪ 前言
Yii2.0 的表单模型里我们经常 scenarios
,直译过来就是场景的意思,究竟其有什么作用呢?
举个简单的例子,例如管理员填写表单里面有 username
和 password
两个的字段,当新增一个管理员时两个字段全部是必填项;但是修改的时候,只用 username
字段必填,password
可以不填。
正常的情况下,新增时的规则:[['username','password'], 'required']
,而编辑时的规则:[['username'], 'required']
就可以了。但是如何让两条规则同时存在又互不影响你呢?场景可以帮你解决这种问题,下面是一个简单的场景实例。
▪ 实例
模型层:
public function rules()
{
return [
['username','required', 'message'=>'账号不能为空'],
['password','required', 'message'=>'密码不能为空', 'on'=>'update'] // `on` 字段表示该规则应用的场景
];
}
控制器:
$formAdmin = new FormAdmin();
if( Yii::$app->request->isPost ){
$formAdmin->load(Yii::$app->request->post(), '');
$formAdmin->validate();
}
当控制器里面没有使用任何场景:validate() 函数仅验证账号,密码不验证。
$formAdmin = new FormAdmin();
if( Yii::$app->request->isPost ){
$formAdmin->load(Yii::$app->request->post(), '');
$formAdmin->setScenario('update');
$formAdmin->validate();
}
当控制器里面设置了
update
场景:validate() 函数验证账号,同时也验证密码。
总结一:
- 指定
'on'
字段值的规则(rule)仅在其对应场景下执行 - 没有
'on'
字段值的规则(rule)将在任何场景下被执行
▪ 高级
默认情况下,表单模型的验证机制采用 总结一 的规则执行,但是当我们重写表单模型的 scenarios()
函数后,我们又可以另外的验证机制,例如:
public function scenarios()
{
return [
'update'=>['password'] // 表示 update 场景下仅处理 'password' 字段
// 实际效果:在 update 场景下只验证密码,其他的都不验证
];
}
总结二:
- 当指定了场景的字段后,那么没有
'on'
字段值的规则(rule)将不被执行