日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Yii2 事件学习笔记

發(fā)布時間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Yii2 事件学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Yii2中事件一般用event表示,只有集成了yii\base\component的對象才能集成類或者對象級別的事件處理過程。 事件的理解和使用要點主要有以下幾個要點: 1.事件如何觸發(fā)? 2.事件處理器是什么? 3.事件級別分為哪幾個? 4.如何把事件處理器(handle)綁定到事件上? 5.如何解綁handle? 6.事件處理器的執(zhí)行順序? 7.事件常見用途 1.事件觸發(fā) 調(diào)用 yii\base\Component::trigger() 方法觸發(fā),通常會在類內(nèi)部某個方法里調(diào)用,如下: 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 回調(diào)函數(shù),參數(shù)是一個event對象。 下面復(fù)習(xí)一下回調(diào)函數(shù)的一般寫法: ①.匿名函數(shù) function($event){ } ②.某個對象的方法 [$obj,'方法名稱'] ③.類的靜態(tài)防范 [static::className(),'靜態(tài)方法名'] ④.全局函數(shù),這種情況比較少一點, '全局方法名' 3.事件級別 官方文檔沒有強(qiáng)調(diào)這個,可以大致分為3個級別: ①對象級別,對于某個對象的事件觸發(fā),參考1中的例子 ②類級別事件處理, 如果想對某一類對象不想一個個的附加事件處理,可以在類級別直接綁定,使用方法如下。 調(diào)用yii\base\Event的on方法 Event::on(靜態(tài)類名,靜態(tài)類事件,事件處理器); 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'); });

?

③全局事件綁定以及處理 全局應(yīng)用即Yii::$app,全局應(yīng)用是個單例對象,可以使用對象的事件綁定方法 第一步,在應(yīng)用入口腳本: Yii::$app->on('bar', function ($event) {echo get_class($event->sender); // 顯示 "app\components\Foo" });

?

第二步:埋點,在需要的地方進(jìn)行觸發(fā) Yii::$app->trigger('bar', new Event(['sender' => new Foo])); 這里的觸發(fā)器的第二個參數(shù)表示可以定義事件對象的一些屬性, name:事件名 sender:調(diào)用 trigger() 方法的對象 data:附加事件處理器時傳入的數(shù)據(jù),默認(rèn)為空 4.如何把事件處理器(handle)綁定到事件上? 一般而言,調(diào)用類或者對象的on方法即可,但是對于類或者對象的on方法的參數(shù)會有一些不一樣。 5.如何解綁handle? 解綁發(fā)方法為off,與4中on的使用類似。 6.事件處理器的執(zhí)行順序? 事件處理器將按附加次序依次調(diào)用,默認(rèn)新附加的事件處理器排在已存在處理器隊列的最后。 特殊情況如果需要優(yōu)先調(diào)用則可以在on函數(shù)中傳遞第四個參數(shù)為false,即可第一個調(diào)用。如下所示: $foo->on(Foo::EVENT_HELLO, function ($event) { // 這個處理器將被插入到處理器隊列的第一位... }, $data, false);

?

7.經(jīng)典用法 事件的用途比較多,常見的用途是記錄日志, 如記錄全局的代碼級別的操作日志,數(shù)據(jù)庫的更新操作日志等等。 ①記錄全局訪問日志的寫法: 在配置文件中假如如下配置: 'on beforeRequest' => handle; ②記錄數(shù)據(jù)庫更新操作 第一步,在配置文件新增行為配置:'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中進(jìn)行事件綁定,并指定事件處理器,在事件處理器中進(jìn)行具體的記錄操作,代碼類似如下: 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更新操作那么不要直接記錄到當(dāng)前數(shù)據(jù)庫,否則會引起循環(huán)記錄 } }

?

轉(zhuǎn)載于:https://www.cnblogs.com/bestOrnothing/p/yii2_event.html

總結(jié)

以上是生活随笔為你收集整理的Yii2 事件学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。