Yii2 EVENT事件的了解

2021-09-27 09:08:03 字數 2947 閱讀 7981

使用事件,可以在特定的時點,觸發執行預先設定的一段**,事件既是**解耦的一種方式,也是設計業務流程的一種模式。現代軟體中,事件無處不在,比如,你發了個微博,觸發了乙個事件,導致關注你的人,看到了你新發出來的內容。對於事件而言,有這麼幾個要素:

事例介紹:有乙隻貓,它一叫老鼠就會跑

為了實現這個事例,我們在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...