Yii2 事件学习笔记
生活随笔
收集整理的這篇文章主要介紹了
Yii2 事件学习笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Yii2中事件一般用event表示,只有集成了yii\base\component的對象才能集成類或者對象級別的事件處理過程。 事件的理解和使用要點主要有以下幾個要點: 1.事件如何觸發? 2.事件處理器是什么? 3.事件級別分為哪幾個? 4.如何把事件處理器(handle)綁定到事件上? 5.如何解綁handle? 6.事件處理器的執行順序? 7.事件常見用途 1.事件觸發 調用 yii\base\Component::trigger() 方法觸發,通常會在類內部某個方法里調用,如下: namespace app\components;use yii\base\Component;
use yii\base\Event;class Foo extends Component
{const EVENT_HELLO = 'hello';public function bar() { $this->trigger(self::EVENT_HELLO); } }
?
2.事件處理器 Event Handlers 事件處理器是一個PHP 回調函數,參數是一個event對象。 下面復習一下回調函數的一般寫法: ①.匿名函數 function($event){ } ②.某個對象的方法 [$obj,'方法名稱'] ③.類的靜態防范 [static::className(),'靜態方法名'] ④.全局函數,這種情況比較少一點, '全局方法名' 3.事件級別 官方文檔沒有強調這個,可以大致分為3個級別: ①對象級別,對于某個對象的事件觸發,參考1中的例子 ②類級別事件處理, 如果想對某一類對象不想一個個的附加事件處理,可以在類級別直接綁定,使用方法如下。 調用yii\base\Event的on方法 Event::on(靜態類名,靜態類事件,事件處理器); use Yii; use yii\base\Event; use yii\db\ActiveRecord;Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {Yii::trace(get_class($event->sender) . ' is inserted'); });?
③全局事件綁定以及處理 全局應用即Yii::$app,全局應用是個單例對象,可以使用對象的事件綁定方法 第一步,在應用入口腳本: Yii::$app->on('bar', function ($event) {echo get_class($event->sender); // 顯示 "app\components\Foo" });?
第二步:埋點,在需要的地方進行觸發 Yii::$app->trigger('bar', new Event(['sender' => new Foo])); 這里的觸發器的第二個參數表示可以定義事件對象的一些屬性, name:事件名 sender:調用 trigger() 方法的對象 data:附加事件處理器時傳入的數據,默認為空 4.如何把事件處理器(handle)綁定到事件上? 一般而言,調用類或者對象的on方法即可,但是對于類或者對象的on方法的參數會有一些不一樣。 5.如何解綁handle? 解綁發方法為off,與4中on的使用類似。 6.事件處理器的執行順序? 事件處理器將按附加次序依次調用,默認新附加的事件處理器排在已存在處理器隊列的最后。 特殊情況如果需要優先調用則可以在on函數中傳遞第四個參數為false,即可第一個調用。如下所示: $foo->on(Foo::EVENT_HELLO, function ($event) { // 這個處理器將被插入到處理器隊列的第一位... }, $data, false);?
7.經典用法 事件的用途比較多,常見的用途是記錄日志, 如記錄全局的代碼級別的操作日志,數據庫的更新操作日志等等。 ①記錄全局訪問日志的寫法: 在配置文件中假如如下配置: 'on beforeRequest' => handle; ②記錄數據庫更新操作 第一步,在配置文件新增行為配置:'as adminLog' => 'app\\behaviors\\AdminDbLogBehavior'; 第二部,在yii\db\command類中埋點,比如在execute中: const EVENT_EXECUTE = 'execute'; public function execute() {$this->trigger(self::EVENT_EXECUTE);.....other code }?
第三步,在AdminDbLogBehavior.php中進行事件綁定,并指定事件處理器,在事件處理器中進行具體的記錄操作,代碼類似如下: namespace frontend\behaviors;use Yii; use yii\base\Application; use yii\base\Behavior; use yii\base\Event; use yii\db\Command; class AdminLogBehavior extends Behavior { public function events() { return [ Application::EVENT_BEFORE_REQUEST => 'handle' ]; } public function handle() { Event::on(Command::className(), Command::EVENT_EXECUTE,[$this,'log']); } public function log($event) { //具體的記錄操作, //如果是記錄db更新操作那么不要直接記錄到當前數據庫,否則會引起循環記錄 } }?
轉載于:https://www.cnblogs.com/bestOrnothing/p/yii2_event.html
總結
以上是生活随笔為你收集整理的Yii2 事件学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#控制IE浏览器自动点击等事件WebB
- 下一篇: EventBus VS Spring E