# Codeigniter Hooks :::success :bookmark: 書籤 [TOC] ::: ## 使用範例 ### 1. 從/application/config/config/打開鉤子功能 ```php /* |-------------------------------------------------------------------------- | Enable/Disable System Hooks |-------------------------------------------------------------------------- | | If you would like to use the 'hooks' feature you must enable it by | setting this variable to TRUE (boolean). See the user guide for details. | */ $config['enable_hooks'] = TRUE; ``` ### 2. 從/application/config/config/hooks.php新增範例 ```php $hook['pre_system'] = array( 'class' => 'TestHook', //class名稱 'function' => 'getHooksSystem',//class中要調用方法 'filename' => 'TestHook.php',//檔案名稱 /** 檔案位置 (預設/application/hooks/ 若你的檔案 在/application/hooks/example中 則檔案路徑為hooks/example **/ 'filepath' => 'hooks', 'params' => []//方法傳入參數 ); $hook['pre_controller'] = array( 'class' => 'TestHook', 'function' => 'getHooksController', 'filename' => 'TestHook.php', 'filepath' => 'hooks', 'params' => [] ); $hook['post_controller_constructor'] = array( 'class' => 'TestHook', 'function' => 'getHooksPostConstructor', 'filename' => 'TestHook.php', 'filepath' => 'hooks', 'params' => [] ); $hook['post_controller'] = array( 'class' => 'TestHook', 'function' => 'getHooksPostController', 'filename' => 'TestHook.php', 'filepath' => 'hooks', 'params' => [] ); $hook['display_override'] = array( 'class' => 'TestHook', 'function' => 'getHooksDisplayOverride', 'filename' => 'TestHook.php', 'filepath' => 'hooks', 'params' => [] ); $hook['cache_override'] = array( 'class' => 'TestHook', 'function' => 'getHooksCacheOverride', 'filename' => 'TestHook.php', 'filepath' => 'hooks', 'params' => [] ); $hook['post_system'] = array( 'class' => 'TestHook', 'function' => 'getHooksPostSystem', 'filename' => 'TestHook.php', 'filepath' => 'hooks', 'params' => [] ); ``` ### 3. 從/application/hooks/ 新增TestHook類別 ``` php class TestHook{ public function getHooksSystem() { echo "我被鉤子調用了,在系統執行的初期執行。這時只有benchmark及hook類別被載入。路由或其他程序都還沒執行。<br>"; } public function getHooksController() { echo "我被鉤子調用了,在所有的控制器(controller)呼叫之前執行。此時所有的基礎類別、路由、安全檢查都已經完成。<br>"; } public function getHooksPostConstructor() { echo "我被鉤子調用了,在控制器(controller)實例化之後但是任何方法都還未呼叫之前立刻執行。<br>"; } public function getHooksPostController() { echo "我被鉤子調用了,在控制器(controller)執行完畢之後立刻執行。<br>"; } public function getHooksDisplayOverride() { echo '我被鉤子調用了,覆蓋用來在系統執行完畢後向瀏覽器送出完成的頁面的 _display() 函數。這樣就允許你用你自己定義的顯示方法。<br>注意,你必須用 $this->CI =& get_instance() 取得CI參考物件然後才可透過呼叫 $this->CI->output->get_output() 來使用完成的頁面資料。<br>'; } public function getHooksCacheOverride() { echo "我被鉤子調用了,讓你可以呼叫自己定義的函數而非output類別中的 _display_cache() 函數。這讓你可以使用自己的cache顯示機制。<br>"; } public function getHooksPostSystem() { echo "我被鉤子調用了,在完成的頁面送到瀏覽器之後呼叫。在系統執行結束時,完成的資料已送到瀏覽器之後執行。<br>"; } } ``` --- ## 範例畫面 ### 範例畫面(一) ![](https://i.imgur.com/ypy7tqO.png) ### 範例畫面(二) 註解display_override ![](https://i.imgur.com/v30UnF1.png) ![](https://i.imgur.com/AGaDdR9.png) ### 範例畫面(二) 為什麼跑出Welcome? 在官方文件中提到 #### display_override鉤子 >覆蓋用來在系統執行完畢後向瀏覽器送出完成的頁面的 _display() 函數。這樣就允許你用你自己定義的顯示方法。注意,你必須用 $this->CI =& get_instance() 取得CI參考物件然後才可透過呼叫 $this->CI->output->get_output() 來使用完成的頁面資料。