Yii的事件機制 - 簡單實例

1.環境搭建

我們在vendor目錄創建event測試目錄包含cat和mouse的兩個類

要想擁有事件機制就要繼承yii\base\Component  其中包含事件的觸發 綁定 解綁等方法

cat:

namespace vendor\event;
use yii\base\Component;
use yii\base\Event;

//創建一個事件對象 用於傳遞數據
class MyEvent extends Event
{
    public $message;
    public function data(){
        echo 'abc';
    }
}

//必須繼承組件類 - 其中包含事件處理方法
class Cat extends Component
{
    public function shout(Event $event){
        echo 'miao miao miao<br />';

        //當shout方法執行時觸發miao事件 並接收一個參數
        $this->trigger('miao',$event);
    }
}
mouse:

namespace vendor\event;

class Mouse
{
    public function run($data){
        //自定義事情
        echo 'I want to run away<br />';
        //處理參數
        echo  $data->message;
        $data->data();
    }
}
控制器中實現

namespace app\controllers;
use yii\web\Controller;
use vendor\event\Cat;
use vendor\event\Mouse;
use vendor\event\MyEvent;

class TestController extends Controller
{
    public function actionTest(){
        //實例化小貓 小鼠
        $cat = new Cat();
        $mourse = new Mouse();

        //實例化事件對象 - 用以傳遞數據
        $event = new MyEvent();
        $event->message = 'i am data<br />';
        //給小貓的miao事件綁定一個處理方法
        $cat->on('miao', [$mourse, 'run'],$message);//這裏可以是匿名函數或$message作爲參數3 以事件屬性方式調用
        $cat->off('miao', [$mourse, 'run']);//解綁小鼠的run方法

        //小貓觸發事件
        $cat->shout($event);

        return $this->renderPartial('test');
    }
}

運行結果

miao miao miao
I want to run away
i am dataabc
----------------------------------------------------------------------------------------------------------------------------------------------------------以上是單個實例的觸發綁定

怎樣實現類級別的綁定功能呢? 使用\yii\base\Event::on(); 方法。用法如下

\yii\base\Event::on(Cat::className, '事件名', [處理類, 處理動作]);


這樣所有Cat的實例都會觸發到指定事件,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章