鉤子 - 擴(kuò)展框架的核心
CodeIgniter 的鉤子功能使得您可以在不修改系統(tǒng)核心文件的基礎(chǔ)上來改變或增加系統(tǒng)的核心運(yùn)行功能。 當(dāng) CodeIgniter 運(yùn)行后,它會產(chǎn)生出一個特殊的進(jìn)程,這個進(jìn)程在 項(xiàng)目流程 頁面中有說明。 當(dāng)然,您可以自定義一些動作來替代程序運(yùn)行過程中的某些階段。例如,您可以在控制器剛剛載入前或剛剛載入后來運(yùn)行特定的腳本,或者在其他時刻來觸發(fā)您的腳本。
啟用鉤子
鉤子功能可以在全局范圍內(nèi)打開或關(guān)閉,您可以在 application/config/config.php 文件中設(shè)定:
$config['enable_hooks'] = TRUE;
定義鉤子
鉤子是在 application/config/hooks.php 文件中定義的。 每個鉤子可以用以下格式的數(shù)組來定義:
$hook['pre_controller'] = array(
????????????????????????????????'class'????=> 'MyClass',
????????????????????????????????'function' => 'Myfunction',
????????????????????????????????'filename' => 'Myclass.php',
????????????????????????????????'filepath' => 'hooks',
????????????????????????????????'params'???=> array('beer', 'wine', 'snacks')
????????????????????????????????);
說明:
數(shù)組的索引與你使用的指定掛鉤點(diǎn)名字相關(guān).上面的例子中掛鉤點(diǎn)是pre_controller. 掛鉤點(diǎn)參數(shù)列表如下所示. 以下各項(xiàng)將定義在你的相關(guān)鉤子數(shù)組里:
- class? 你希望調(diào)用的類名.如果你更喜歡使用過程函數(shù)代替類的話,此項(xiàng)保留為空.
- function? 你希望調(diào)用的函數(shù)名.
- filename? 包含有你的類/函數(shù)的文件名.
- filepath? 包含你的腳本的目錄名. 注意: 你的腳本放在 application 文件夾下的目錄里, 這樣 filepath就以那個文件夾(application)為基準(zhǔn). 例如, 如果你的腳本放在application/hooks下, 你可以把hooks 作為你的filepath. 如果你的腳本放在application/hooks/utilities下你可以把 hooks/utilities作為filepath. 注意后面沒有"/".如果不放在根目錄下可以根據(jù)相對路徑的配置,來完成調(diào)用。這樣就可以完成,多個應(yīng)用共享一個鉤子。
- params? 你希望傳遞給腳本的任何參數(shù). 此項(xiàng)是可選的.
同一掛鉤點(diǎn)的多次引用
如果你想在同一個掛鉤點(diǎn)引用多個腳本,最簡單的方式就是把你的數(shù)組定義成二維的,像這樣:
$hook['pre_controller'][] = array(
????????????????????????????????'class'????=> 'MyClass',
????????????????????????????????'function' => 'Myfunction',
????????????????????????????????'filename' => 'Myclass.php',
????????????????????????????????'filepath' => 'hooks',
????????????????????????????????'params'???=> array('beer', 'wine', 'snacks')
????????????????????????????????);
$hook['pre_controller'][] = array(
????????????????????????????????'class'????=> 'MyOtherClass',
????????????????????????????????'function' => 'MyOtherfunction',
????????????????????????????????'filename' => 'Myotherclass.php',
????????????????????????????????'filepath' => 'hooks',
????????????????????????????????'params'???=> array('red', 'yellow', 'blue')
????????????????????????????????);
注意在每個數(shù)組索引后面的中括號:
$hook['pre_controller'][]
這允許你的多個腳本擁有相同的掛鉤點(diǎn)。你定義數(shù)組的順序?qū)⑹浅绦驁?zhí)行的順序.
掛勾點(diǎn)
以下是一組可用的掛鉤點(diǎn).
-
pre_system
系統(tǒng)執(zhí)行的早期調(diào)用.僅僅在benchmark 和 hooks?類?加載完畢的時候. 沒有執(zhí)行路由或者其它的過程. -
pre_controller
在調(diào)用你的任何控制器之前調(diào)用.此時所用的基礎(chǔ)類,路由選擇和安全性檢查都已完成. -
post_controller_constructor
在你的控制器實(shí)例化之后,任何方法調(diào)用之前調(diào)用. -
post_controller
在你的控制器完全運(yùn)行之后調(diào)用. -
display_override
覆蓋_display()函數(shù), 用來在系統(tǒng)執(zhí)行末尾向web瀏覽器發(fā)送最終頁面.這允許你用自己的方法來顯示.注意,你需要通過 $this->CI =& get_instance() 引用 CI 超級對象,然后這樣的最終數(shù)據(jù)可以通過調(diào)用 $this->CI->output->get_output() 來獲得。 -
cache_override
可以讓你調(diào)用自己的函數(shù)來取代output類中的_display_cache() 函數(shù).這可以讓你使用自己的緩存顯示方法 -
post_system
在最終著色頁面發(fā)送到瀏覽器之后,瀏覽器接收完最終數(shù)據(jù)的系統(tǒng)執(zhí)行末尾調(diào)用
?