在yii中的Application的run方法中,只看到各種trigger,並沒有看到各種事件的綁定?請問,這些事件在哪裡綁定的?
回複內容:
在yii中的Application的run方法中,只看到各種trigger,並沒有看到各種事件的綁定?請問,這些事件在哪裡綁定的?
一定要多看官方文檔
事件的綁定
有了事件handler,還要告訴Yii,這個handler是負責處理哪種事件的。這個過程,就是事件的綁定, 把事件和事件handler這兩個螞蚱綁在一根繩上,當事件跳起來的時候,就會扯動事件handler啦。
yiibaseComponent::on() 就是用來綁定的,很容易就猜到, yiibaseComponent::off()
就是用來解除的。對於綁定,有以下形式:
$person = new Person;// 使用PHP全域函數作為handler來進行綁定$person->on(Person::EVENT_GREET, 'person_say_hello');// 使用對象$obj的成員函數say_hello來進行綁定$person->on(Person::EVENT_GREET, [$obj, 'say_hello']);// 使用類Greet的靜態成員函數say_hello進行綁定$person->on(Person::EVENT_GREET, ['app\helper\Greet', 'say_hello']);// 使用匿名函數$person->on(Person::EVENT_GREET, function ($event) { echo 'Hello';});
事件的綁定可以像上面這樣在運行時以代碼的形式進行綁定,也可以在配置中進行綁定。 當然,這個配置生效的過程其實也是在運行時的。原理可以參見 配置項(Configuration) 部分的內容。
上面的例子只是簡單的綁定了事件與事件handler,如果有額外的資料傳遞給handler,可以使用
yiibaseComponent::on() 的第三個參數。這個參數將會寫進 Event 的相關資料欄位,即屬性 data 。如:
$person->on(Person::EVENT_GREET, 'person_say_hello', 'Hello World!');// 'Hello World!' 可以通過 $event訪問。function person_say_hello($event){ echo $event->data; // 將顯示 Hello World!}
yiibaseComponent 維護了一個handler數組,用來儲存綁定的handler:
// 這個就是handler數組private _events = [];// 綁定過程就是將handler寫入_event[]public function on($name, $handler, $data = null, $append = true){ $this->ensureBehaviors(); if ($append || empty($this->_events[$name])) { $this->_events[$name][] = [$handler, $data]; } else { array_unshift($this->_events[$name], [$handler, $data]); }}
綁定當然是你自己寫。
比如,Yii架構會在查詢成功之後觸發EVENT_AFTER_FIND
事件,至於你想在查詢成功之後做些什麼,這是你自己的事,根據你的需要來,架構怎麼會知道。所以是你來調用on
方法給事件綁定回呼函數。
補充:
我說的架構不管綁定不是說架構一個事件都不綁定,而是指並不是架構觸發的每個事件它自己都要綁定一下。
題主到底懂不懂事件機制啊,觸發事件是為了讓你去Binder 方法來執行。它如果不觸發,那你怎麼用啊。
比如你看下面的代碼,我實現了一個函數:
function sum(a, b) { trigger('before_sum'); return a + b;}
我一定要給before_sum
事件綁定個處理函數嗎?
我的sum函數是給別人用的,我觸發這個事件是為了他可以使用。他可以綁定事件以便在執行sum的時候先執行他自己的一段代碼。
我自己給before_sum綁定處理函數幹嘛?我想在return之前執行什麼代碼我直接寫進去不就行了。