一、在model中声明场景
如果要定义 方法名必须是 scenarios()
如果不定义 scenarios(),只在controller里注明 场景值的话,会把未加场景的rule和对应场景的一同验证。
如果在controller里也未注明 场景值的话,rules中绑定场景的字段则不验证,只验证通用字段。
create 场景包含'amount', 'years', 'type', 'handlerName', 'departmentID', 'feeID', 'purpose',
update 场景 对'amount', 'years', 不做要求。就需要单独对 create 场景中 'amount', 'years'进行配置规则。
public function scenarios()
{
return [
'create' => ['amount', 'years', 'type', 'handlerName', 'departmentID', 'feeID', 'purpose'],
'update' => ['type', 'handlerName', 'departmentID', 'feeID', 'purpose'],
];
}
//参考网上更优做法
public function scenarios()
{
//合并了父类scenarios方法的default场景,避免了设置场景后没有设置场景(没有设置场景是default场景)的模型rules验证问题
return array_merge(parent::scenarios(), [
'create' => ['amount', 'years', 'type', 'handlerName', 'departmentID', 'feeID', 'purpose'],
'update' => ['type', 'handlerName', 'departmentID', 'feeID', 'purpose'],
]);
}
二、 reles() on 关键字绑定,一个场景用字符串,多个场景用数组
public function rules()
{
return [
....
[['type', 'handlerName', 'departmentID', 'feeID', 'purpose'], 'required', 'on' => ['create','update']],//场景关键词 on ,场景名与方法无关。
[['amount', 'years'], 'required', 'on' => ['create']],
];
}
三、控制器方法里注明场景
public function actionCreate()
{
$model = new AnnualBudget();
//$model = AnnualBudget(['scenario' => 'create']);//有此行即可省略下面
$model->scenario = 'create';//对应模型里的场景名!
//$model->setScenario('create')
.....
}
针对yii2中文社区的场景法。可以参考下http://www.yiichina.com/tutorial/89
网友评论