Thinkphp實戰利用鉤子使用行為擴充套件 (Hook)

Jack2k發表於2021-09-09

上午研究了幾篇關於使用Hook實現鉤子的例項或詳細描述,總結了一些,所以打算寫兩個例項深入記憶。

注意事項:

注意事項:
1.觸發行為的關鍵方法是Hook類中的listen方法,它透過遍歷某個行為標籤下的所有行為,依次例項化並呼叫run方法
2.listen方法中,如果之前在配置檔案中開啟了DEBUG模式,則它會生成日誌記錄你的行為,這裡面牽涉到3.很多的IO操作,所以你的專案完成時建議取消DEBUG模式以提升速度
3.listen方法中,允許傳遞引數且只允許傳遞一個引數(傳多個可以用陣列呢),不過這個引數是引用傳值,所以只能傳入變數,傳入常量會報錯
4.最後,LibraryThinkBehavior.class.php,這個抽象類中只有一個抽象方法run(),在你的自己行為擴充套件中建議繼承它,儘管這不是必須的,但是這樣更加規範

例項1

1.在控制器中 Application->Home->Controller->IndexController.class.php 新增如下程式碼:

namespace HomeController;use ThinkController;use ThinkHook;//引用Hookclass IndexController extends Controller {    public function index(){
        Hook::add('ad','Behavior\adBehavior'); //手動註冊行為 ad 是註冊行為的名稱 後面的是路徑 接下來會說如何新建路徑中的檔案
        hook::listen('ad',$parnam);//觸發行為 (這種是在控制器中觸發行為,還有在html頁面中觸發行為的 接下來就會看到) $parnam 為想要帶的引數 可以隨便定義  html中觸發的話請註釋這句
        $this->display();
    }
}

2.來新建一個行為取名叫ad(廣告),->Library->Behavior->adBehavior.class.php
在裡面寫入程式碼:

    namespace Behavior;    class adBehavior{        function run($arg){            //$arg為帶過來的引數 可以在其中寫入自己的業務邏輯 行為必須執行run 
            echo '我是一條'.$arg['name'].'廣告,'.$arg['value'].'代言';        //在此介紹下,run必須的 ,細心的會在Think核心找到Behavior.class.php裡面有這樣一句操蛋的話  abstract public function run(&$params); 你懂的
        }
    }

3.在模板中使用 Application->Home->View->Index->index.html 新增如下程式碼:

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> 
    
    
    
    

How to used?

    {:hook('ad', array('name'=>'AV','value'=>'*老師'))} //這個呢就是在頁面中觸發行為的方式了

4.還需要一步    如果我們想在模板上呼叫例如{:tag('example',array('name'=>'name','value'=>'value'))} 這樣的方法,首先我們到 ->Common->functions.php,你會搜到 tag 這個方法,複製下 tag 方法,修改為

function hook($hook,$params=array()){
    ThinkHook::listen($hook,$params);        //監聽一個鉤子}

例項1結束

例項2

例項一已經夠詳細了例項二是根據 修改的 比較簡潔 自動註冊就不在列舉

使用鉤子觸發行為擴充套件的流程:

1.自動註冊(Common/Conf/tags.php按格式自己新增),或者 手動註冊(類中方法如初始方法,呼叫Hook::add(tags,name));
2.寫好自己的行為類,類名以Behavior結尾,實現run方法
3.在需要新增行為的函式里 ,直接Hook::Listen(tags,prarm),注意一定要傳變數,不需要傳常量。

例子:

HomeIndexController;中程式碼:

 public function index()
     {         
         //這裡我是手動註冊的行為
         Hook::add('ads','HomeBehaviorsadsBehavior');//ads 為行為名稱 後面的是路徑
         hook::listen('ads',$param);   //這個是監聽觸發行為 $param為傳遞的引數 可自定義
     }
}

新建 HomeBehaviorsadsBehavior.php
寫入程式碼:

OK,完成,剛剛超過下班2分鐘。愉快下班。



作者:jew丶
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/36/viewspace-2802663/,如需轉載,請註明出處,否則將追究法律責任。

相關文章