# 鉤子 - 擴展框架核心
CodeIgniter 的鉤子特性提供了一種方法來修改框架的內部運作流程,而無需修改 核心文件。CodeIgniter 的運行遵循著一個特定的流程,你可以參考這個頁面的?[應用程序流程圖](http://codeigniter.org.cn/user_guide/overview/appflow.html)?。但是,有些時候你可能希望在 執行流程中的某些階段添加一些動作,例如在控制器加載之前或之后執行一段腳本, 或者在其他的某些位置觸發你的腳本。
## 啟用鉤子
鉤子特性可以在?**application/config/config.php**?文件中全局的啟用或禁用, 設置下面這個參數:
~~~
$config['enable_hooks'] = TRUE;
~~~
## 定義鉤子
鉤子是在?**application/config/hooks.php**?文件中被定義的,每個鉤子可以定義 為下面這樣的數組格式:
~~~
$hook['pre_controller'] = array(
'class' => 'MyClass',
'function' => 'Myfunction',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
~~~
**注意:**
數組的索引為你想使用的掛鉤點名稱,譬如上例中掛鉤點為 pre_controller , 下面會列出所有可用的掛鉤點。鉤子數組是一個關聯數組,數組的鍵值可以是 下面這些:
* **class**?你希望調用的類名,如果你更喜歡使用過程式的函數的話,這一項可以留空。
* **function**?你希望調用的方法或函數的名稱。
* **filename**?包含你的類或函數的文件名。
* **filepath**?包含你的腳本文件的目錄名。 注意: 你的腳本必須放在?application/?目錄里面,所以 filepath 是相對?application/?目錄的路徑,舉例來說,如果你的腳本位于?application/hooks/?,那么 filepath 可以簡單的設置為 'hooks' ,如果你的腳本位于?application/hooks/utilities/?, 那么 filepath 可以設置為 'hooks/utilities' ,路徑后面不用加斜線。
* **params**?你希望傳遞給你腳本的任何參數,可選。
如果你使用 PHP 5.3 以上的版本,你也可以使用 lambda表達式(匿名函數或閉包)作為鉤子, 這樣語法更簡單:
~~~
$hook['post_controller'] = function()
{
/* do something here */
};
~~~
## 多次調用同一個掛鉤點
如果你想在同一個掛鉤點處添加多個腳本,只需要將鉤子數組變成二維數組即可,像這樣:
~~~
$hook['pre_controller'][] = array(
'class' => 'MyClass',
'function' => 'MyMethod',
'filename' => 'Myclass.php',
'filepath' => 'hooks',
'params' => array('beer', 'wine', 'snacks')
);
$hook['pre_controller'][] = array(
'class' => 'MyOtherClass',
'function' => 'MyOtherMethod',
'filename' => 'Myotherclass.php',
'filepath' => 'hooks',
'params' => array('red', 'yellow', 'blue')
);
~~~
注意數組索引后面多了個中括號:
~~~
$hook['pre_controller'][]
~~~
這可以讓你在同一個掛鉤點處執行多個腳本,多個腳本執行順序就是你定義數組的順序。
## 掛鉤點
以下是所有可用掛鉤點的一份列表:
* **pre_system**?在系統執行的早期調用,這個時候只有 基準測試類 和 鉤子類 被加載了, 還沒有執行到路由或其他的流程。
* **pre_controller**?在你的控制器調用之前執行,所有的基礎類都已加載,路由和安全檢查也已經完成。
* **post_controller_constructor**?在你的控制器實例化之后立即執行,控制器的任何方法都還尚未調用。
* **post_controller**?在你的控制器完全運行結束時執行。
* **display_override**?覆蓋?_display()?方法,該方法用于在系統執行結束時向瀏覽器發送最終的頁面結果。 這可以讓你有自己的顯示頁面的方法。注意你可能需要使用?$this->CI?=&?get_instance()?方法來獲取 CI 超級對象,以及使用?$this->CI->output->get_output()?方法來 獲取最終的顯示數據。
* **cache_override**?使用你自己的方法來替代?[輸出類](http://codeigniter.org.cn/user_guide/libraries/output.html)?中的?_display_cache()?方法,這讓你有自己的緩存顯示機制。
* **post_system**?在最終的頁面發送到瀏覽器之后、在系統的最后期被調用。
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量