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