Yii框架的事件(Event)和行爲(Behavior)

一、Yii事件機制(Event):
<?php
class TestController extends CController
{
//添加onclick事件
        public function onClick($event)
        {
                $this->raiseEvent('onClick',$event);
        }
//頁面載入自動調用,爲onclick事件綁定函數 "Click"
        public function init()
{
                $this->attachEventHandler('onClick',array($this,'Click'));
        }
//onClick事件對應的方法
        public function Click()
{
                echo "This message comes from Event Click!";
echo "<br>";
        }
//使用到事件的頁面
public function acrtionLogin()
{
//調用事件onclick
if($this->hasEventHandler('onClick'))
{
$this->onClick(new CEvent());
}
//頁面其他正常邏輯
echo "this is page login!";
}
}
?>

##注:在訪問頁面login的時候會輸出:

This message comes from Event Click!

this is page login!


##分析:YII事件機制其實就是採用了設計模式中的“觀察者模式”,當對象的成員變量發生變化的時候會通知另一個對象做出相應的改變。


事件機制分爲這麼幾個步驟:1.添加事件,也就是上例中的方法1,2.爲事件綁定方法,也就是上例中init()方法裏面那句代碼,
3.觸發事件,也就是login方法中的那個if語句中的那句代碼。
####################################################################
####################################################################
二、Yii的行爲(Behavior):
<?php


class TestController extends CController
{
public function init()
{
$this->attachBehavior('mybehavior',new MyBehavior());
}
public function actionLogin(){
echo $this->name;
}
}

class MyBehavior extends CBehavior
{ private $_name="No1";
public function getName()
{
return $this->_name;
}
public function setName($value)
{
$this->_name=$value;
}
}
?>
##注:訪問test的login頁面,輸出 "No1";
##分析:一般來說爲一個類添加屬性和方法的方式通常是2種,第一是直接在類裏面做修改,
第二種是使用擴展類。實際開發中當然用的最多的是第二種。這也符合設計原則中的封閉原則。
然而這種方式也不是十全十美的,有時候一個屬性或者方法只有在特定的環境中才會用到,
如果我們因此爲其做了擴展類或者在現有的類中添加,是相當浪費的。
Yii框架使用的Behavior掛載方式來實現對類的擴展。說白了也就是類的組合。分析觀察Yii所有類的
基類CComponent可以發現,此類中除了一些魔術方法之外,有2個私有屬性 "$_m"和"$_e";其中$_m是用來存放
添加的Behavior對象,$_e是用來存放註冊的事件對象Event。此類中的魔術方法會尋找擴展類中以get和set打頭的方法,
上面這個例子就是一個很好的說明,當在login中訪問屬性name的時候,TestController並沒有name屬性,但是TestController
掛載了MyBehavior對象,那就會去$_m中的MyBehavior對象中尋找name,還是找不到,就會觸發__get()這個魔術方法,此方法中
會搜尋有沒有getName()這個方法,如果有就調用之。這也是一些比較主流的框架喜歡採用的方式。
關於CComponent的詳細介紹:http://www.yiiframework.com/forum/index.php?/topic/17072-ccomponent%E5%9F%BA%E7%A1%80%E7%B1%BB/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章