您的位置:首页 > 编程语言 > PHP开发

yii2 scenarios rules 使用心得

2015-11-16 11:49 681 查看
原文转自  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里面未指定场景的会全部校验
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  yii2 scenarios rules