中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ThinkPHP6.0中事件系統以及查詢事件、模型事件的使用示例

發布時間:2021-01-16 10:20:32 來源:億速云 閱讀:410 作者:小新 欄目:編程語言

小編給大家分享一下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',
        // 更多事件訂閱
    ],
];

內置事件

內置的系統事件包括:

ThinkPHP6.0中事件系統以及查詢事件、模型事件的使用示例

AppInit事件定義必須在全局事件定義文件中定義,其它事件支持在應用的事件定義文件中定義。

原來5.1的一些行為標簽已經廢棄,所有取消的標簽都可以使用中間件更好的替代。可以把中間件看成處理請求以及響應輸出相關的特殊事件。事實上,中間件的handle方法只是具有特殊的參數以及返回值而已。

查詢事件

數據庫操作的回調也稱為查詢事件,是針對數據庫的CURD操作而設計的回調方法,主要包括:

ThinkPHP6.0中事件系統以及查詢事件、模型事件的使用示例

使用下面的方法注冊數據庫查詢事件

\think\facade\Db::event('before_select', function ($query) {
    // 事件處理
    return $result;
});

同一個查詢事件可以注冊多個響應執行。查詢事件在新版里面也已經被事件系統接管了,因此如果你注冊了一個before_select查詢事件監聽,底層其實是向標識為db.before_select的事件注冊了一個監聽。

查詢事件的方法參數只有一個:當前的查詢對象。但你可以通過依賴注入的方式添加額外的參數。

模型事件

模型事件是指在進行模型的查詢和寫入操作的時候觸發的操作行為。

模型事件只在調用模型的方法生效,使用查詢構造器操作是無效的。

模型支持如下事件:

ThinkPHP6.0中事件系統以及查詢事件、模型事件的使用示例

注冊的回調方法支持傳入一個參數(當前的模型對象實例),但支持依賴注入的方式增加額外參數。

如果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中事件系統以及查詢事件、模型事件的使用示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

噶尔县| 叙永县| 郸城县| 丹寨县| 盐亭县| 崇左市| 长沙县| 都昌县| 延寿县| 玉屏| 龙州县| 江川县| 什邡市| 五寨县| 西畴县| 伊川县| 内丘县| 石林| 水城县| 宝丰县| 平潭县| 余庆县| 满洲里市| 文山县| 雅江县| 岳普湖县| 随州市| 合江县| 临夏县| 板桥市| 晋城| 西丰县| 手游| 广宁县| 天峻县| 平江县| 马鞍山市| 蛟河市| 正宁县| 三河市| 监利县|