首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CodeIgniter Hook 機制原理與擴展實戰

     編輯:PHP 相關知識

深入 CodeIgniter Hook 核心:原始碼解析與功能擴展實作

CodeIgniter 的 Hook(鉤子)機制提供了在不修改核心程式碼前提下擴展框架功能的強大途徑。透過預定義的執行節點(如 pre_system、pre_controller、post_controller 等),開發者可在系統關鍵階段注入自訂邏輯。本文將剖析 Hook.php 核心原始碼,揭示其初始化、註冊、調用全流程。

Hook 核心類別結構解析

class CI_Hooks {
    var $enabled = FALSE;      // 是否啟用
    var $hooks = array();      // 所有鉤子定義
    var $in_progress = FALSE;  // 防止重入標記
    
    function __construct() {
        $this->_initialize();
    }
    
    function _initialize() {
        // 1. 讀取 config.php 中 $config['enable_hooks']
        // 2. 載入 config/hooks.php 定義陣列至 $this->hooks
        // 3. 設定 $this->enabled = TRUE
    }
    
    function _call_hook($which) {
        // 依鉤子節點名稱(如 pre_system)調用對應鉤子
        // 支援單一鉤子或多個鉤子陣列
    }
    
    function _run_hook($data) {
        // $data 為 hooks.php 中單一鉤子定義陣列
        // 1. 載入檔案:APPPATH . $data['filepath'] . '/' . $data['filename']
        // 2. 實例化類別:new $data['class']()
        // 3. 呼叫方法:$obj->$data['function']($data['params'])
    }
}

啟用與定義 Hook 步驟

  1. 啟用:在 application/config/config.php 設定 $config['enable_hooks'] = TRUE;
  2. 定義:編輯 application/config/hooks.php,例:
    $hook['pre_controller'] = [
        'class'    => 'AuthCheck',
        'function' => 'verify',
        'filename' => 'AuthCheck.php',
        'filepath' => 'hooks',
        'params'   => ['redirect' => 'login']
    ];
  3. 實作:在 application/hooks/AuthCheck.php 建立類別與方法

常用鉤子節點時機表

節點觸發時機典型應用
pre_system系統初始化極早期全域常數定義、效能監控啟動
pre_controller控制器實例化前權限驗證、語言偵測、維護模式
post_controller_constructor控制器建構子執行後載入通用 Library、模板變數注入
post_controller控制器方法執行後頁面快取、資料紀錄
display_override覆蓋 _display() 方法自訂輸出壓縮、模板引擎整合

多重 Hook 執行順序

同一節點可定義多個 Hook,系統會依陣列順序依序執行。若需控制優先序,調整 hooks.php 中陣列順序即可。

最佳實踐建議

  • 將 Hook 類別放置於 application/hooks/ 目錄,保持結構清晰
  • 避免在 Hook 中執行耗時操作,影響回應速度
  • 善用 params 傳遞配置,提高複用性
  • 開發階段開啟日誌 log_message('debug', 'Hook 執行: ' . $which) 便於除錯

掌握 Hook 機制,即可在 CodeIgniter 中實現 AOP 風格的橫切關注點分離,讓核心業務邏輯更專注、擴展功能更彈性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved