首页 > 其他 > 详细

Yii 事件行为的过程详解

时间:2014-03-12 06:29:44      阅读:465      评论:0      收藏:0      [点我收藏+]

  Yii  的事件行为稍微有点复杂。为了更好的理解和运用事件行为,我在这里专门对自己一个项目的事件行为,进行彻底的解析。

  首先看下怎么用这个事件行为.

 

     1.先在protected/components下面创建一个组件

      bubuko.com,布布扣

 

  2. 再在Controller下面实例化一个组件对象:

      bubuko.com,布布扣

 

      3. 在protected/extensions下面创建一个行为的文件夹并且在这个文件夹下面创建一个行为类

      bubuko.com,布布扣

 

      4.回到Controller 我们为其中的一个事件进行绑定

      bubuko.com,布布扣

 

      5.接着绑定一个行为:

     bubuko.com,布布扣

     6. 当然我们还要触发行为之前,先要有个事件才行,这样,才能知道触发了什么事件才做出什么行为,上面绑定事件的代码中,

        有个数组,其中一个元素是‘setLogs‘这个就是我们要触发的事件,所以我们为这个事件写个方法:

      bubuko.com,布布扣

      7. ok 了现在只要触发事件就能做出行为了,呢么就触发把,下面是触发的代码:

       bubuko.com,布布扣

     8.Well Done!!! 想弄事件行为的朋友们看到这里就可以结束了,因为只需要知道怎么用就行了,但是这样

       不过就是会用而已,就像汽车,你只会开而已,如果汽车坏了怎么办,所以,我是喜欢,专研下去,到底

       这个机制是怎么样的,我摸索了半天,其实挺复杂的,尽我力量,剖析一下把。

 

      ********************************分析  Yii 的事件行为 核心*************************

     1.我们先从上面的第2步开始看。实例化组件。这个组件其实我们已经创建好了。我们在这个组件中随便写入2

       “ onEditPwd_log” 和“onLogin_log”它们共同带有参数($event),这个参数是干什么的后面再讲

     2.我们可以发现,我们创建的这个logsComponents组件是继承CComponent的,在yii中绝大多是都用法都

        要继承这个,这个是核心。所以我们 var_dump一下这个实例化出来的组件对象:

        bubuko.com,布布扣

        看到了吧,2个私有化属性.先别着急想这2个属性干什么用的.接着看

      3.我们看第4步。绑定事件。这里给这个组件的对象的其中一个方法进行赋值,值就是这个array($this,‘setLogs‘),

         我们想想,这个不是个方法吗,怎么可能会被赋值,对了!!因为这个组件是继承了CComponent这个类,

         这个类中的2个魔术方法 __set 和__get我不用多说了。

         然后我们使用了onlogin_log这个属性,注意!是属性名,不是方法。并且赋值一个数组,所以在CComponent中

         会走到下面红框的步骤中去,并且带上$value=array($this,‘setLogs‘);

         bubuko.com,布布扣

         当他查到是以ON开头的名字 并且有这个方法的时候,就会走到下一步,紧接着判断isset($this->_e[$name])。这里

         当然没有了。一开始$this->_e是为null的,所以走入下一步..我们直接把name带入进去分析,就是

         ‘$this->_e[onlogin_log] = new Clist‘   这里实例化了 Clist这个类。 也就是把这个类的对象存储到了$this->_e

         数组当中。

          呢么我们看下Clist 这个类把.(这个类路径是framework\collections\Clist.php)

          bubuko.com,布布扣

          这里 我先把这3个属性翻译一下(其实大家都看的懂)

          $_d = array()  // 就是内部数据的存储仓库

          $_c = 0          //  项目的个数

          $_r = false     //   判断这个列表是否只读

          ok!! 我们既然已经实例化了这个类,呢么必然先看这个类的构造函数,因为它会被先执行。

          bubuko.com,布布扣

          这里先判断 $data 是否为null,肯定为null啊,所以,我们直接到 setReadOnly来: 

          bubuko.com,布布扣

          这里$value = false.所以$this->_r也就被赋予了false,所以这个列表的只读被关闭了.

          well!!! 呢么好了。这个‘$this->_e[onlogin_log’ 的对象也就是这样子的了:

          bubuko.com,布布扣

      然后来到最后一句: ‘$this->_e[$name]->add($value);‘ 因为$this->_e[$name] 的对象

           是bubuko.com,布布扣 呢么我们就找这里有没有方法是add的。果然有个:

            bubuko.com,布布扣

           注意:前面‘$this->_e[$name]->add($value)’方法带进来的是$value,呢么$value 我们前面

            也说过了是个‘array($this,‘setLogs‘)‘数组,所以这里$item也就是带进来的array($this,‘setLogs‘)‘数组

           然后将其带入 ‘insertAt方法‘ 并且这里的$this->_c 是为0 ,查看上面这个对象,可以看到他是0 ;

           bubuko.com,布布扣

     这里我看$this_r 是否为真,我们通过这个对象知道这个是false,所以非假即真,进入判断$index,因为这个是参数

           $this->_c = 0带进来的所以,他为0 也全等于$this->_c,所以这个数据存储仓库$this->_d[0]就是等于$item了

          又因为 $tiem =是带进来的array($this,‘setLogs‘)‘数组 所以这个$this->_d[0] = array($this,‘setLogs‘);

    4.ok!事件我们分析到这里,我们来分析一下绑定的行为:‘$this->logsCom->attachBehavior("test","ext.behaviors.LogsBehavior")‘

    同样,这个logsCom我们已经实例化过了,我现在要用这个对象,使用attachBehgavior 这个方法;

     

    

Yii 事件行为的过程详解,布布扣,bubuko.com

Yii 事件行为的过程详解

原文:http://www.cnblogs.com/PHPKing/p/3594040.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!