CodeIgniter 鉤子 - 擴(kuò)展框架核心

2018-07-21 15:37 更新

鉤子 - 擴(kuò)展框架核心

CodeIgniter 的鉤子特性提供了一種方法來(lái)修改框架的內(nèi)部運(yùn)作流程,而無(wú)需修改 核心文件。CodeIgniter 的運(yùn)行遵循著一個(gè)特定的流程,你可以參考這個(gè)頁(yè)面的 應(yīng)用程序流程圖 。但是,有些時(shí)候你可能希望在 執(zhí)行流程中的某些階段添加一些動(dòng)作,例如在控制器加載之前或之后執(zhí)行一段腳本, 或者在其他的某些位置觸發(fā)你的腳本。

啟用鉤子

鉤子特性可以在 application/config/config.php 文件中全局的啟用或禁用, 設(shè)置下面這個(gè)參數(shù):

$config['enable_hooks'] = TRUE;

定義鉤子

鉤子是在 application/config/hooks.php 文件中被定義的,每個(gè)鉤子可以定義 為下面這樣的數(shù)組格式:

$hook['pre_controller'] = array(
    'class'    => 'MyClass',
    'function' => 'Myfunction',
    'filename' => 'Myclass.php',
    'filepath' => 'hooks',
    'params'   => array('beer', 'wine', 'snacks')
);

注意:

數(shù)組的索引為你想使用的掛鉤點(diǎn)名稱,譬如上例中掛鉤點(diǎn)為 pre_controller , 下面會(huì)列出所有可用的掛鉤點(diǎn)。鉤子數(shù)組是一個(gè)關(guān)聯(lián)數(shù)組,數(shù)組的鍵值可以是 下面這些:

  • class 你希望調(diào)用的類名,如果你更喜歡使用過(guò)程式的函數(shù)的話,這一項(xiàng)可以留空。
  • function 你希望調(diào)用的方法或函數(shù)的名稱。
  • filename 包含你的類或函數(shù)的文件名。
  • filepath 包含你的腳本文件的目錄名。 注意: 你的腳本必須放在 application/ 目錄里面,所以 filepath 是相對(duì) application/ 目錄的路徑,舉例來(lái)說(shuō),如果你的腳本位于 application/hooks/ ,那么 filepath 可以簡(jiǎn)單的設(shè)置為 'hooks' ,如果你的腳本位于 application/hooks/utilities/ , 那么 filepath 可以設(shè)置為 'hooks/utilities' ,路徑后面不用加斜線。
  • params 你希望傳遞給你腳本的任何參數(shù),可選。

如果你使用 PHP 5.3 以上的版本,你也可以使用 lambda表達(dá)式(匿名函數(shù)或閉包)作為鉤子, 這樣語(yǔ)法更簡(jiǎn)單:

$hook['post_controller'] = function()
{
    /* do something here */
};

多次調(diào)用同一個(gè)掛鉤點(diǎn)

如果你想在同一個(gè)掛鉤點(diǎn)處添加多個(gè)腳本,只需要將鉤子數(shù)組變成二維數(shù)組即可,像這樣:

$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')
);

注意數(shù)組索引后面多了個(gè)中括號(hào):

$hook['pre_controller'][]

這可以讓你在同一個(gè)掛鉤點(diǎn)處執(zhí)行多個(gè)腳本,多個(gè)腳本執(zhí)行順序就是你定義數(shù)組的順序。

掛鉤點(diǎn)

以下是所有可用掛鉤點(diǎn)的一份列表:

  • pre_system 在系統(tǒng)執(zhí)行的早期調(diào)用,這個(gè)時(shí)候只有 基準(zhǔn)測(cè)試類 和 鉤子類 被加載了, 還沒(méi)有執(zhí)行到路由或其他的流程。
  • pre_controller 在你的控制器調(diào)用之前執(zhí)行,所有的基礎(chǔ)類都已加載,路由和安全檢查也已經(jīng)完成。
  • post_controller_constructor 在你的控制器實(shí)例化之后立即執(zhí)行,控制器的任何方法都還尚未調(diào)用。
  • post_controller 在你的控制器完全運(yùn)行結(jié)束時(shí)執(zhí)行。
  • display_override 覆蓋 _display() 方法,該方法用于在系統(tǒng)執(zhí)行結(jié)束時(shí)向?yàn)g覽器發(fā)送最終的頁(yè)面結(jié)果。 這可以讓你有自己的顯示頁(yè)面的方法。注意你可能需要使用 $this->CI =& get_instance() 方法來(lái)獲取 CI 超級(jí)對(duì)象,以及使用 $this->CI->output->get_output() 方法來(lái) 獲取最終的顯示數(shù)據(jù)。
  • cache_override 使用你自己的方法來(lái)替代 輸出類 中的 _display_cache() 方法,這讓你有自己的緩存顯示機(jī)制。
  • post_system 在最終的頁(yè)面發(fā)送到瀏覽器之后、在系統(tǒng)的最后期被調(diào)用。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)