Yii 的事件行为稍微有点复杂。为了更好的理解和运用事件行为,我在这里专门对自己一个项目的事件行为,进行彻底的解析。
首先看下怎么用这个事件行为.
1.先在protected/components下面创建一个组件
2. 再在Controller下面实例化一个组件对象:
3. 在protected/extensions下面创建一个行为的文件夹并且在这个文件夹下面创建一个行为类
4.回到Controller 我们为其中的一个事件进行绑定
5.接着绑定一个行为:
6. 当然我们还要触发行为之前,先要有个事件才行,这样,才能知道触发了什么事件才做出什么行为,上面绑定事件的代码中,
有个数组,其中一个元素是‘setLogs‘这个就是我们要触发的事件,所以我们为这个事件写个方法:
7. ok 了现在只要触发事件就能做出行为了,呢么就触发把,下面是触发的代码:
8.Well Done!!! 想弄事件行为的朋友们看到这里就可以结束了,因为只需要知道怎么用就行了,但是这样
不过就是会用而已,就像汽车,你只会开而已,如果汽车坏了怎么办,所以,我是喜欢,专研下去,到底
这个机制是怎么样的,我摸索了半天,其实挺复杂的,尽我力量,剖析一下把。
********************************分析 Yii 的事件行为 核心*************************
1.我们先从上面的第2步开始看。实例化组件。这个组件其实我们已经创建好了。我们在这个组件中随便写入2
“ onEditPwd_log” 和“onLogin_log”它们共同带有参数($event),这个参数是干什么的后面再讲
2.我们可以发现,我们创建的这个logsComponents组件是继承CComponent的,在yii中绝大多是都用法都
要继承这个,这个是核心。所以我们 var_dump一下这个实例化出来的组件对象:
看到了吧,2个私有化属性.先别着急想这2个属性干什么用的.接着看
3.我们看第4步。绑定事件。这里给这个组件的对象的其中一个方法进行赋值,值就是这个array($this,‘setLogs‘),
我们想想,这个不是个方法吗,怎么可能会被赋值,对了!!因为这个组件是继承了CComponent这个类,
这个类中的2个魔术方法 __set 和__get我不用多说了。
然后我们使用了onlogin_log这个属性,注意!是属性名,不是方法。并且赋值一个数组,所以在CComponent中
会走到下面红框的步骤中去,并且带上$value=array($this,‘setLogs‘);
当他查到是以ON开头的名字 并且有这个方法的时候,就会走到下一步,紧接着判断isset($this->_e[$name])。这里
当然没有了。一开始$this->_e是为null的,所以走入下一步..我们直接把name带入进去分析,就是
‘$this->_e[onlogin_log] = new Clist‘ 这里实例化了 Clist这个类。 也就是把这个类的对象存储到了$this->_e
数组当中。
呢么我们看下Clist 这个类把.(这个类路径是framework\collections\Clist.php)
这里 我先把这3个属性翻译一下(其实大家都看的懂)
$_d = array() // 就是内部数据的存储仓库
$_c = 0 // 项目的个数
$_r = false // 判断这个列表是否只读
ok!! 我们既然已经实例化了这个类,呢么必然先看这个类的构造函数,因为它会被先执行。
这里先判断 $data 是否为null,肯定为null啊,所以,我们直接到 setReadOnly来:
这里$value = false.所以$this->_r也就被赋予了false,所以这个列表的只读被关闭了.
well!!! 呢么好了。这个‘$this->_e[onlogin_log’ 的对象也就是这样子的了:
然后来到最后一句: ‘$this->_e[$name]->add($value);‘ 因为$this->_e[$name] 的对象
是
呢么我们就找这里有没有方法是add的。果然有个:
注意:前面‘$this->_e[$name]->add($value)’方法带进来的是$value,呢么$value 我们前面
也说过了是个‘array($this,‘setLogs‘)‘数组,所以这里$item也就是带进来的‘array($this,‘setLogs‘)‘数组
然后将其带入 ‘insertAt方法‘ 并且这里的$this->_c 是为0 ,查看上面这个对象,可以看到他是0
;
这里我看$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 这个方法;
原文:http://www.cnblogs.com/PHPKing/p/3594040.html