Yii2之事件處理

Yii2之事件處理

經過事件(Event)處理,能夠在某個特定時刻執行指定的代碼,能夠解耦代碼,同時也增長了可維護性,一般,事件在客戶端軟件中比較好理解,好比onClick,onFocus,當點擊按鈕,獲取到焦點時執行指定代碼。在PHP中,事件的處理可能不太好理解,可是,只要理清了事件處理的過程,一切都會變得簡單:yii2

1.註冊(或者說綁定)針對某個動做事件的處理器(handler)app

2.觸發某個動做事件yii

3.觸發1中註冊(綁定)的處理器函數

4.執行處理器中的代碼post

 

下面以 貓叫鼠跑 這個例子來簡單說明Yii2中的事件處理。this

Controller中的代碼:spa

 

1對象

2事件

3get

4

5

6

7

8

9

10

public function actionTest(){

        $cat = new Cat('Tom');

        $mouse = new Mouse('Jerry');

        

        $data = array('msg'=>'miaow miaow miaow!');

        //註冊Cat::EVENT_AFTER_SHOUT事件響應(這裏對Cat的EVENT_AFTER_SHOUT響應$mouse 的runout方法)

        $cat->on(Cat::EVENT_AFTER_SHOUT, [$mouse,'runout'], $data);

        //觸發shout事件

        $cat->shout();

}

Cat類代碼:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Cat extends \yii\base\Component{

    private $_name;

    const EVENT_AFTER_SHOUT = 'afterShout';

    

    function __construct($name) {

        $this->_name = $name;

    }

    

    public function shout(){

        echo 'I am a Cat,I am shouting!';

        //觸發事件處理

        $this->trigger(self::EVENT_AFTER_SHOUT);

    }

}

 

Mouse類代碼:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

class Mouse extends \yii\base\Component{

    private $_name;

    

    function __construct($_name) {

        $this->_name = $_name;

    }

    

    public function runout($event){

        //事件名稱,事件數據,事件發送者

        var_dump($event->name,$event->data,$event->sender);

        echo 'Cat is shouting,I am a mouse so I need to run!';

    }

}

執行actionTest時,會依次輸出如下結果

 

1

I am a Cat,I am shouting!

 

 

1

Cat is shouting,I am a mouse so I need to run!

 

 

在Yii2中,事件分爲三個級別:

1.實例事件(同上面的例子,僅對某個實例有效)

2.類事件(對整個類有效)

 

1

2

3

4

5

6

7

yii\base\Event::on(

    Cat::className(),                     // 第一個參數表示事件發生的類

    Cat::EVENT_AFTER_SHOUT,                  // 第二個參數表示是什麼事件

    function ($event) {                      // 對事件的處理

        echo $event->sender;

    }

);

3.全局事件(對全局有效)

 

1

2

3

Yii::$app->on('eventName', function ($event) {

    echo get_class($event->sender);        // 顯示當前觸發事件的對象的類名稱

});

 

 

除了綁定事件外,某些場合也須要移除綁定的事件,經常使用方法有如下幾種:

PHP

 

1

2

3

4

5

6

7

8

// 刪除全部EVENT_AFTER_SHOUT事件的handler

$cat->off(Cat::EVENT_AFTER_SHOUT);

 

// 刪除一個對象的成員函數的handler

$cat->off(Cat::EVENT_AFTER_SHOUT, [$mouse, 'runout']);

 

// 刪除一個PHP全局函數的handler

$cat->off(Cat::EVENT_AFTER_SHOUT, 'global_onAfterShout');

相關文章
相關標籤/搜索