yii2 關於事件的疑問

來源:互聯網
上載者:User
關鍵字 php yii yii2
在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之前執行什麼代碼我直接寫進去不就行了。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.