yii行为和过滤器

  1. 行为是对类的功能进行了扩展,针对开闭原则,为了类的扩展而生,不去修改类原有的代码。
  2. yii的行为需要继承yiiaseBehavior,这就好比你要给人安装一个胳膊,这个胳膊得是人的,而不能是老虎的、大象的,要遵守这个规范。
  3. 而接受行为绑定的类必须得是继承了component的子类,同样是一个规范吧。
  4. 转  yii行为的讲解:https://blog.csdn.net/qq_24127857/article/details/79394485
  5. 经测试发现,如果给一个类绑定了两个行为,并且这两个行为类里面都定义了相同的属性name, 那么在调用这个name属性的时候,不会报错,而是会调用写在前面的行为类的name属性。具体见代码
    class TestController extends Controller
    {
        public function actionTest()
        {
            echo 'this is  test action<br>';
            $this->foo();
            $this->who();
            echo $this->name;  //这个属性是MyBehavior 和 YourBehavior 都有的属性,这里不会报错
        }
    
        public function behaviors()
        {
            return [
                'mybehavior' => MyBehavior::className(), //这个在前,那么就调用MyBehavior里的name属性,而不是报错
                'yourbehavior' => YourBehavior::className(), // 
            ];
        }
    }
    
    //第一个行为类MyBehavior
    class MyBehavior extends Behavior
    {
        public $name = 'me';
        public $age;
    
        public function foo()
        {
            echo 'this is foo function<br>';
        }
    
        public function bar()
        {
            return 'this is bar function<br>';
        }
    }
    
    //第二个YourBehavior
    class YourBehavior extends Behavior
    {
        public $name = 'you';
    
        public function who()
        {
            echo 'who are you?<br>';
        }
    }
  6. 过滤器
    //还是上面的TestController调用
    class MyFilter extends ActionFilter
    {
        public $name;
    
        public function beforeAction($action)
        {
            echo '这个 是在test function 之前执行的beforeAction<br>';
            return parent::beforeAction($action);
        }
    
        public function afterAction($action, $result)
        {
            echo '这个是在test function 之后执行的afterAction<br>';
            $result = 'result 有什么用呢?<br>';
            return parent::afterAction($action, $result); // TODO: Change the autogenerated stub
        }
    
        public function beforeFilter($event)
        {
            echo 'this is event? beforeFilter<br>';
            return parent::beforeFilter($event); // TODO: Change the autogenerated stub
        }
    
        public function afterFilter($event)
        {
            echo 'this is event? afterFilter<br>';
            parent::afterFilter($event); // TODO: Change the autogenerated stub
        }
    }
    //output:
    this is event? beforeFilter
    这个 是在test function 之前执行的beforeAction
    this is tes action
    this is event? afterFilter
    这个是在test function 之后执行的afterAction
    result 有什么用呢?
原文地址:https://www.cnblogs.com/bneglect/p/11976002.html