原文转自 It技术擎
下面介绍scenarios rules 使用 心得
例子: region.php
public function scenarios()
{
$parent_scenarios = parent::scenarios();//继承父类的场景
//定义自己的场景
$self_scenarios = [
'create' => ['region_name','pid'],//登录的时候需要的字段
'update' => ['region_name'],//注册的时候需要的字段
];
//合并场景
return array_merge($parent_scenarios,$self_scenarios);
}
/**
* @inheritdoc
*/
public function rules()
{
return [
#[['region_name','pid', 'pinyin'],'required','message' => '是必填写项1'],//A
[['region_name', 'pinyin','pid'],'required','message' => '是必填写项2','on'=>'create'],//B
#[['region_name'],'required','message' => '是必填写项3','on'=>"create"],//C
[['pid', 'level', 'status'], 'integer'],
[['region_name', 'pinyin', 'zip'], 'string', 'max' => 100],
[['short_name'], 'string', 'max' => 50]
];
}
regioncontroller.php
public function actionCreate()
{
$model = new Region();
$model->setScenario('create');
... ...
}
如果想使用场景的话 在controller对应的action里面一定要把场景的名称带上。不管是使用scenarios 还是rules
以下是做create操作的
1、 如上的scenarios 加 B
scenarios 里面的create只定义了两个字段'region_name','pid' 而 rules里面却定义了 三个字段'region_name', 'pinyin','pid' 并且指定场景是create.
这样在create操作的时候 只会校验 'region_name','pid' 两个字段。'pinyin'字段不进行校验 ,校验规则是B
2、如上的scenarios 加 A
scenarios 里面的create只定义了两个字段'region_name','pid' 而 rules里面却定义了 三个字段'region_name', 'pinyin','pid' 未指定任何的场景.
这样在create操作的时候 只会校验 'region_name','pid' 两个字段。'pinyin'字段不进行校验,校验规则是A
3、如上的scenarios 加 A 加B
scenarios 里面的create只定义了两个字段'region_name','pid' 而 rules里面却定义了 三个字段'region_name', 'pinyin','pid' ,且一个指定场景一个未指定使用的是默认的
这样的结果和上面的 2的结果是一样的 ,校验规则是A
4、如上的scenarios 加 C
scenarios 里面的create只定义了两个字段'region_name','pid' 而 rules里面却定义了 一个字段'region_name' 并且指定场景是create.
这样在create操作的时候 只会校验 'region_name' 一个字段。'pid'字段会不进行校验
总结
1、当指定场景的时候 controller是一定要存在指定的场景名称的
2、rules里面校验的字段一定要比scenarios里面定义的字段多
3、当默认场景存在的时候 默认是优先的,自定义的次之
4、rules里面未指定场景的会全部校验