# 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() 來使用完成的頁面資料。