使用事件,可以在特定的時點,觸發執行預先設定的一段**,事件既是**解耦的一種方式,也是設計業務流程的一種模式。現代軟體中,事件無處不在,比如,你發了個微博,觸發了乙個事件,導致關注你的人,看到了你新發出來的內容。對於事件而言,有這麼幾個要素:
事例介紹:有乙隻貓,它一叫老鼠就會跑
為了實現這個事例,我們在frontend資料夾中建立event資料夾
在event資料夾中2個類檔案,乙個cat類,乙個mouse類
<?php
namespace frontend\event;
/** * 貓類
* class: \frontend\event\cat
* * 為了讓貓具有事件能力
* 所以要繼承 \yii\base\component
* >>> \yii\base\component 對 \yii\base\event 的 on 方法進行重寫
* >>> \yii\base\event 適合類級繫結
* >>> \yii\base\component 適合物件級繫結
*/class cat extends \yii\base\component
}
mouse.php
<?php
namespace frontend\event;
/** * 老鼠類
* class: \frontend\event\mouse
*/class mouse
}
eventcontroller.php
<?php
namespace frontend\controllers;
use frontend\event\cat;
use frontend\event\mouse;
/*** class: \frontend\controllers\event
*/class eventcontroller extends \yii\web\controller
}
在瀏覽器輸入
得到
貓:miao miao miao
老鼠:有貓來了,趕緊跑啊~~
通過呼叫貓的 shout 方法,觸發 miao 事件,老鼠就跑了
突然間,有一天,狗加入這件事例,只要貓一叫,狗就會去找貓
so 也是在event資料夾中
加入狗成員 dog.php
<?php
namespace frontend\event;
/** * class \frontend\event\dog
*/class dog extends \yii\base\component
}
修改 frontend/controllers/eventcontroller.php
新增狗找貓事件
...
// 需事先給貓繫結 miao 事件才可以觸發此事件
// 貓一叫,就觸發老鼠的 run 方法
$cat->on('miao', [$mouse, 'run']);
$cat->on('miao', [$dog, 'findcat']); // 新增狗找貓事件
// 讓貓發出叫聲
$cat->shout();
...
在瀏覽器中重新整理
得到
貓:miao miao miao
老鼠:有貓來了,趕緊跑啊~~
狗:wang wang wang, 貓在**??
突然間,狗覺得很無聊,不想去找貓了,隨便它叫了
那麼我們只需將狗找貓事件取消繫結
修改 frontend/controllers/eventcontroller.php
use frontend\event\cat;
use frontend\event\mouse;
use frontend\event\dog;
...public function actiontest()
...
所以得到的最終結果自然少了狗的聲音
但是有乙個問題,以上事件直針對$cat所賦值的物件,
即在 frontend/controllers/eventcontroller.php 中的 actiontest 方法末尾中新增(new cat())->shout();不會觸發 miao 事件
public function actiontest()
原因:都是通過$cat物件進行事件繫結的
那有沒有一種,只要是貓發出的聲音,老鼠就跑呢??
這就需要用到類級別的事件繫結
類級別事件繫結需要用到 \yii\base\event類
修改 frontend/controllers/eventcontroller.php
use frontend\event\cat;
use frontend\event\mouse;
use yii\base\event;
...public function actiontest()
重新整理頁面,得到
貓:miao miao miao
老鼠:有貓來了,趕緊跑啊~~
貓:miao miao miao
老鼠:有貓來了,趕緊跑啊~~
如果以上理解有錯誤,歡迎提出和指正 yii中事件的了解
剛接觸yii沒多久,因為在實際開發中,對於事件幾乎不會去用。所以,對於yii的事件,沒有很深的了解。這次看了下教程,有種豁然開朗的感覺。按我的理解,yii的事件,就相當於onethink裡面的鉤子,在這些框架的核心程式裡面,我預留一些事件屬性,程式設計師可以在外部呼叫其它類的時候,繫結事件,這樣,有...
event 事件的使用
event用於兩個執行緒間的協作,比如乙個執行緒得到了資料發訊號給另乙個執行緒讓它來處理 多執行緒裡的event from threading import thread,event import time,random event event def light print light is li...
event 事件機制的原理
第一次接觸事件這個概念,對於我來講,還是挺難理解的。最後,想通了,就是事件就相當於乙個委託物件。以下例子,實現同樣的效果,分別用事件與委託物件的 你會覺得還是事件好點。using system using system.collections.generic using system.compone...