溫馨提示×

溫馨提示×

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

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

Thinkphp中Hook行為怎么用

發(fā)布時間:2021-03-10 09:55:23 來源:億速云 閱讀:265 作者:小新 欄目:編程語言

這篇文章主要介紹了Thinkphp中Hook行為怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

欄目給大家介紹一個Thinkphp Hook行為的使用案例,希望對需要的朋友有所幫助!

thinkphp Hook行為的使用案例

行為,官方是如下介紹: 行為(Behavior)是ThinkPHP擴展機制中比較關鍵的一項擴展,行為既可以獨立調(diào)用,也可以綁定到某個標簽中進行偵聽,在官方提出的CBD模式中行為也占了主要的地位,可見行為在ThinkPHP框架中意義非凡。

這里指的行為是一個比較抽象的概念,你可以把行為想象成在應用執(zhí)行過程中的一個動作或者處理。

在框架的執(zhí)行流程中,例如路由檢測是一個行為,靜態(tài)緩存是一個行為,用戶權限檢測也是行為,大到業(yè)務邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網(wǎng)站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應用,而在外圍通過擴展或者配置來改變或者增加一些功能。

而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應用執(zhí)行前,有些行為都是在模板輸出之后,我們把這些行為發(fā)生作用的位置稱之為標簽(位),當應用程序運行到這個標簽的時候,就會被攔截下來,統(tǒng)一執(zhí)行相關的行為,類似于AOP編程中的“切面”的概念,給某一個切面綁定相關行為就成了一種類AOP編程的思想。

使用

行為的定義很簡單,只是在某些場景下的應用,可能有點難以理解。 在 laravel 中, 類似于其事件監(jiān)聽器, 當觸發(fā)了某一行為進行自動觸發(fā)相關的操作方法

舉個例子來說

一個登錄的功能,前期我們只需要校驗密碼即可,按照以往的方法可以這樣做

function checkLogin() {
    
    $this->checkPass();
    
    // -- 新增加的功能
    $this->checkMobile();
    $this->checkCaptcha();
    //... 等等
    
    echo '登錄成功';
}

在如上操作中,是不是很麻煩,針對一個登錄行為, 如果后期功能的增加我們需要不斷的去增加功能就必須得去修改控制器代碼

我們進行解耦該怎么做呢?

即將行為,邏輯(鉤子)分離開, 讓代碼更加易于管理

使用如下,我們直接上圖

Thinkphp中Hook行為怎么用

如上,我們定義了三個不同的即將發(fā)生的行為, 分別為連接網(wǎng)絡 、 關閉電腦、使用電腦

// Connect.php
namespace app\index\behavior;
class Connect
{
    public function run()
    {
        echo '連接網(wǎng)絡';
    }
    public function __destruct()
    {
        echo '<br/>';
    }
}
// End.php
namespace app\index\behavior;
class End
{
    public function run()
    {
        echo '關閉電腦';
        echo '<br/>';
    }
}
// On.php
namespace app\index\behavior;
class On
{
    public function run()
    {
        echo '開啟電腦';
        echo '<br/>';
    }
    public function qq()
    {
        echo '打開QQ';
        echo '<br/>';
    }
    public function opBrowser()
    {
        echo '打開瀏覽器';
        echo '<br/>';
    }
    public function app_end(&$param)
    {
        $param = '結束了';
    }
}

控制器文件 Index.php

namespace app\index\controller;
    
    use think\Hook;
    
    class Index
    {
        public function __construct()
        {
            // 開始綁定使用電腦需要進行的操作
            Hook::add('app_init',
                [
                    'app\\index\\behavior\\On',
                    'app\\index\\behavior\\Connect',
                ]
            ); // 批量綁定
    
            Hook::add('qq', 'app\\index\\behavior\\On');  // 自定義標簽名
            Hook::add('opBrowser', 'app\\index\\behavior\\On'); // 自定義標簽名
    //        Hook::add('app_end', 'app\\index\\behavior\\End'); // 系統(tǒng)標簽位,無需綁定,自動執(zhí)行
    
    
        }
    
        public function index()
        {
            echo '我現(xiàn)在需要使用電腦進行社交';
            echo '<br/>';
    
            Hook::listen('app_init');  // 手動初始化
    
            Hook::listen('qq');  // 打開qq
    
            Hook::listen('opBrowser'); // 打開瀏覽器
        }
    }

輸出結果

Thinkphp中Hook行為怎么用

1) 解析

首先,我們可以在一個全局中,例如控制器初始化中可以使用 Hook::add 開始進行綁定, 綁定完成后就可以使用 Hook::listen() 執(zhí)行相關綁定的方法,盡量不要使用Listen音譯去理解這個方法

他實際上不算監(jiān)聽,實際上是運行的意思, 當Listen的時候,會執(zhí)行相關在前面綁定的方法, 例如 Hook::listen('app_init') 后便會執(zhí)行 'app\\index\\behavior\\On', 'app\\index\\behavior\\Connect'

中的 run 方法

如果 執(zhí)行的行為標簽 app_init 非系統(tǒng)標簽或者在 app\\index\\behavior\\On 中有 app_init 方法,則會就會執(zhí)行其中app_init的方法,而不是執(zhí)行run

2) 自定義標簽

使用自定義標簽必須滿足兩個條件, 1、Hook::add('qq') 對自定義標簽 qq 進行綁定了, 2、對應的行為類中必須存在 qq 這個方法, 否則自動運行 run 方法

3) tags.php 行為綁定

  // ..tags.php
    <?php
    
    
    return [
        'app_init'=> [
            'app\\index\\behavior\\On',
            'app\\index\\behavior\\Connect',
        ],
        'app_end'=> [
            'app\\index\\behavior\\End'
        ]
    ];

可以在控制器下目錄下使用 tags.php 進行綁定。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Thinkphp中Hook行為怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

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

AI