首頁 > 軟體

thinkphp(php)外掛勾點(hooks)分析的簡單實現機制

2023-03-13 06:00:23

現在主流的cms或者blog等系統中,都內建的有外掛系統,但是層層深入、剖析實現的方式,其實都是最簡單的勾點的複雜化的實現。

前言

勾點是外掛執行的觸發器;外掛就像掛在勾點上的東西;外掛只有實現相應勾點方法,並安裝啟用成功後才能執行。

開發者也可以用hook('test')方法在控制器只加入勾點,讓你的應用具有更好的擴充套件性;同時也可以模板里加入勾點{:hook('footer')};勾點也支援傳入引數hook('footer',array('test'=>1));

向系統暴露你的勾點,就是把你的勾點在相應的檔案裡列出來,系統會來檢測。

{:hooks('documentDetailAfter')}

這個的意思就是:相當於在這邊 打一個點 ,我們可以將外掛掛載到那
官方的說法是:檔案末尾顯示顯示的 勾點
意思就是說,在檔案末尾的時候,會自動呼叫掛載在那個 勾點 上的外掛

舉例說明

php中所謂的勾點,其實就是一種事件驅動,主要分為‘註冊事件’、‘觸發事件’兩步。所謂‘註冊事件’,即目的是給未來可能發生的'事情'起一個名字,名字,可以用單例模式或者註冊 為一個全域性的變數,用的時候直接在對應的方法或者類再或者函數中插入這個變數即可;‘觸發事件’,本質上就是在事件的全域性變數中查詢要觸發的時間名稱,然後找到註冊號的類與方法,範例化執行。
舉個例子來說明一下。
專案經理給我們瞭如下的需求:
第一天:開發註冊的功能。
程式設計師巴拉巴拉,三下五除二就完成了。
第二天:在註冊前新增傳送簡訊驗證碼的功能。
程式設計師巴拉巴拉,三峽五除二就又完成了。
第三天:註冊完成之後,給使用者新增相應的積分。
程式設計師又開始巴拉巴拉ing……

    class Register{
        public function index(){
            /**
             * 第二天傳送簡訊功能
             */
            
            /**
             * 第一天註冊程式碼
             */
            
            /**
             * 第三天增加積分功能 
             */
        }
    }

這樣一個人開發還好,多個人開發,勢必會造成配合麻煩的問題,同時程式碼也會變得混亂。

作為優秀程式設計師的我們,當然不容許我們程式中程式碼冗餘、混亂的出現,於是我們把方法寫成函數獨立出來,方便呼叫與程式碼簡介。於是形成如下程式碼:

    class Register{
        public function index(){
            /**
             * 第二天傳送簡訊功能
             */
             sendMsg($data);
            /**
             * 第一天註冊程式碼
             */
            
            /**
             * 第三天增加積分功能 
             */
            sendIntegral($data);
        }
    }
    /**
     * 傳送簡訊
     * @param  {[type]} $data [description]
     * @return {[type]}       [description]
     */
    function sendMsg($data){
        /*
                balabala
         */
    }
    /**
     * 贈送積分
     * @param  {[type]} $data [description]
     * @return {[type]}       [description]
     */
    function sendIntegral($data){
        /*
                balabala
         */
    }

但是我們想要把程式開元出去讓更多的人蔘與,這種直接修改原始碼碼的方式始終不是太好,這個時候,我們就可以使用勾點的方式,在註冊成功前後註冊兩個勾點,我們只需要把勾點告訴開發人員就行了,這樣他們不用改變原始碼碼就可以輕易的進行拓展。

    class Register{
        public function index(){
            
            //註冊前勾點
            Hook::run('registerBefore');
            /**
             * 註冊程式碼
             */
            
            //註冊後勾點
            Hook::run('registerAfter');
        }
    }

勾點的簡單實現程式碼

目錄結構:../hook/Hook.php

勾點核心類Hook.php:

    <?php
    
    namespace hook;
    class Hook{
        
        static protected $hook = [];
        
        /**
         * 外掛註冊
         * @param [type] $name   [description]
         * @param [type] $addons [description]
         */
        static public function add($name,$addons){
            self::$hook[$name] = $addons;
        }
        /**
         * 外掛執行
         * @param  [type] $name [description]
         * @return [type]       [description]
         */
        static public function run($name){
            if(isset(self::$hook[$name])){
                $method = (new self::$hook[$name]());
                   call_user_func([$method,$name]);
            }
            
        }
    }

簡單的外掛demo:

    <?php
    namespace addonsdemo;
    class Demo{
        public function registerBefore(){
            echo 'registerBefore'.'</br>';
        }
        public function registerAfter(){
            echo 'registerAfter'.'</br>';
        }    
    }

外掛實現的地方,即上文的註冊的檔案:

    <?php
    namespace indexcontroller;
    use hookHook;
    class Index{
        public function index(){
            Hook::run('registerBefore');
            echo '註冊完成'.'</br>';
            Hook::run('registerAfter');
            
        }
    }

入口檔案index.php

    <?php
    use indexcontrollerIndex;
    spl_autoload_register('autoload');
    function autoload($name){
        require_once('/'.str_replace('\','/',$name).'.php');
    }
    //外掛註冊
    hookHook::add('registerBefore','\addons\demo\Demo');
    hookHook::add('registerAfter','\addons\demo\Demo');
    //呼叫
    $index = new Index();
    $index->index();

執行介面如下:

  •     registerBefore
  •     註冊完成
  •     registerAfter

如果要新增新的功能,程式設計師只要修改demo的外掛就可,如果要拓展新的功能,只需要拓展registerBefore和registerAfter即可。 

總結

可以說,勾點就是掛載點。

掛載點:在系統中提供給你一個掛載點,我們可以進行外掛開發,開發完成後,我們將其掛載到 掛載點上,會自動呼叫執行。

到此這篇關於thinkphp(php)外掛勾點(hooks)分析的簡單實現機制的文章就介紹到這了,更多相關php外掛勾點(hooks)內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com