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的實例都會觸發到指定事件,