您好,登錄后才能下訂單哦!
小編給大家分享一下ThinkPHP6.0中事件系統以及查詢事件、模型事件的使用示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在最新的6.0版本中引入了新的事件系統用以替代5.1版本的行為,同時也接管了數據庫事件和模型事件。
定義事件
事件系統的所有操作都通過think\facade\Event類進行靜態調用
事件系統使用了觀察者模式,提供了解耦應用的更好方式。在你需要監聽事件的位置,添加如下代碼:
Event::trigger('UserLogin');
或者使用助手函數
event('UserLogin');
這里UserLogin表示一個事件標識,如果你定義了單獨的事件類,你可以使用事件類名,甚至可以傳入一個事件類實例。
event('app\event\UserLogin');
事件類可以通過命令行快速生成
php think make:event UserLogin
默認會生成一個app\event\UserLogin事件類,也可以指定完整類名生成。
我們可以給事件類添加方法
namespace app\event; use app\model\User; class UserLogin { public $user; public function __construct(User $user) { $this->user = $user; } }
一般事件類無需繼承任何其它類。
你可以給事件類綁定一個事件標識
Event::bind('UserLogin', 'app\event\UserLogin');
或者在應用的event.php事件定義文件中批量綁定。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件綁定 ], ];
如果你沒有定義事件類的話,則無需綁定。
ThinkPHP的事件系統不依賴事件類,如果沒有額外的需求,僅通過事件標識也可以使用。
你可以在event方法中傳入一個事件參數
event('UserLogin', $user);
事件監聽
你可以手動注冊一個事件監聽
Event::listen('UserLogin', function($user) { // });
或者使用監聽類
Event::listen('UserLogin', 'app\listener\UserLogin');
可以通過命令行快速生成一個事件監聽類
php think make:listener UserLogin
默認會生成一個app\listener\UserLogin事件監聽類,也可以指定完整類名生成。
事件監聽類只需要定義一個handler方法,支持依賴注入。
<?php namespace app\listener; class UserLogin { public function handle($user) { // 事件監聽處理 } }
在handler方法中如果返回了false,則表示監聽中止,將不再執行該事件后面的監聽。
一般建議直接在事件定義文件中定義對應事件的監聽。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件綁定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件監聽 ], ];
事件訂閱
可以通過事件訂閱機制,在一個監聽器中監聽多個事件,例如通過命令行生成一個事件訂閱者類,
php think make:subscribe User
默認會生成app\subscribe\User類,或者你可以指定完整類名生成。
然后你可以在事件訂閱類中添加不同事件的監聽方法,例如:
<?php namespace app\subscribe; class User { public function onUserLogin($user) { // 事件響應處理 } public function onUserLogout($user) { // 事件響應處理 } }
監聽事件的方法命名規范是on+事件標識(駝峰命名),然后注冊該事件訂閱
Event::subscribe('app\subscribe\User');
一般建議直接在事件定義文件中定義
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事件綁定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事件監聽 ], 'subscribe' => [ '\app\subscribe\User', // 更多事件訂閱 ], ];
內置事件
內置的系統事件包括:
AppInit事件定義必須在全局事件定義文件中定義,其它事件支持在應用的事件定義文件中定義。
原來5.1的一些行為標簽已經廢棄,所有取消的標簽都可以使用中間件更好的替代。可以把中間件看成處理請求以及響應輸出相關的特殊事件。事實上,中間件的handle方法只是具有特殊的參數以及返回值而已。
查詢事件
數據庫操作的回調也稱為查詢事件,是針對數據庫的CURD操作而設計的回調方法,主要包括:
使用下面的方法注冊數據庫查詢事件
\think\facade\Db::event('before_select', function ($query) { // 事件處理 return $result; });
同一個查詢事件可以注冊多個響應執行。查詢事件在新版里面也已經被事件系統接管了,因此如果你注冊了一個before_select查詢事件監聽,底層其實是向標識為db.before_select的事件注冊了一個監聽。
查詢事件的方法參數只有一個:當前的查詢對象。但你可以通過依賴注入的方式添加額外的參數。
模型事件
模型事件是指在進行模型的查詢和寫入操作的時候觸發的操作行為。
模型事件只在調用模型的方法生效,使用查詢構造器操作是無效的。
模型支持如下事件:
注冊的回調方法支持傳入一個參數(當前的模型對象實例),但支持依賴注入的方式增加額外參數。
如果before_write、before_insert、 before_update 、before_delete事件方法中返回false或者拋出think\exception\
ModelEventException異常的話,則不會繼續執行后續的操作。
模型事件定義
最簡單的方式是在模型類里面定義靜態方法來定義模型的相關事件響應。
<?php namespace app\index\model; use think\Model; use app\index\model\Profile; class User extends Model { public static function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public static function onAfterDelete($user) { Profile::destroy($user->id); } }
參數是當前的模型對象實例,支持使用依賴注入傳入更多的參數。
模型事件觀察者
如果希望模型的事件單獨管理,可以給模型注冊一個事件觀察者,例如:
<?php namespace app\index\model; use think\Model; class User extends Model { protected $observerClass = 'app\index\observer\User'; }
User觀察者類定義如下:
<?php namespace app\index\observer; use app\index\model\Profile; class User { public function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public function onAfterDelete($user) { Profile::destroy($user->id); } }
觀察者類的事件響應方法的第一個參數就是模型對象實例,你依然可以通過依賴注入傳入其它的對象參數。
以上是“ThinkPHP6.0中事件系統以及查詢事件、模型事件的使用示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。