YII2 场景运用 demo

2020-04-30  本文已影响0人  阿_莫西林

一、在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

上一篇 下一篇

猜你喜欢

热点阅读