• 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 有什么用呢?
  • 相关阅读:
    市场规模的估算
    C#中的线程(一)入门 转载
    2.设计模式-Abstract Factory 抽象工厂模式
    1.设计模式
    Microsoft.Jet.OLEDB.4.0读取EXCEL数据
    转载--加盐密码哈希:如何正确使用
    ragel学习资源整合
    开源库xlslib跨平台编译
    WPF开源框架以及经典博客
    (转载)值得推荐的C/C++框架和库 (真的很强大)
  • 原文地址:https://www.cnblogs.com/bneglect/p/11976002.html
Copyright © 2020-2023  润新知