這篇文章學習CI框架的鉤子特性。php
hooks是CI框架提供的一種機制,容許你在程序框架運行流程的某個階段執行你本身的一些代碼。好比系統運行前,CI_Controller調用前,系統運行結束後等特定的時間節點,執行自定義的函數。如同官方所言,CodeIgniter 的鉤子特性提供了一種方法來修改框架的內部運做流程,而無需修改 核心文件。html
hooks的邏輯主要寫在system/core/Hooks.php的CI_Hooks類中。框架在Codeigniter.php中載入該類。數組
1 /* 2 * ------------------------------------------------------ 3 * Instantiate the hooks class 4 * ------------------------------------------------------ 5 */ 6 $EXT =& load_class('Hooks', 'core');
在初始化CI_Hooks類的時候,程序會讀取在application/config/hooks.php中定義的$hooks數組,而且保存到類成員屬性$this->hooks 中,注意這裏是引用傳遞值。$hooks數組的定義能夠採用以下方式定義:閉包
1 $hook['pre_controller'] = array( 2 'class' => 'MyClass', 3 'function' => 'Myfunction', 4 'filename' => 'Myclass.php', 5 'filepath' => 'hooks', 6 'params' => array('beer', 'wine', 'snacks') 7 );
數組的索引pre_controller稱爲掛鉤點,在這裏指在你的控制器調用以前執行。還有不少的掛鉤點,具體能夠參看官方說明。app
_run_hook 是真正調用的CI_Hooks類中真正調用鉤子的方法。它先判斷該鉤子是何種形式,若是是ambda 表達式/匿名函數(或閉包)做爲鉤子,則直接執行。若是是以數組的形式設置,則會去找到文件。進一步處理。值得注意的是,程序會把鉤子的類的實例保存在類成員$this->_objects中,以便還有鉤子調用該類的時候直接使用,不用再實例化。我的以爲這種鉤子會重複使用同一個鉤子的狀況不太常見,有些不必,可是沒有實際案例使用,也許做者有本身的考慮吧。框架
注意,鉤子的調用是同步執行。ide
call_hook函數是暴露給外部執行掛鉤點鉤子的方法,同一掛鉤點能夠設置多個鉤子。函數
實例:若是你在application/hooks/文件夾中,新建Myclass.php文件,輸入如下內容,就會看到呈現。codeigniter
<?php class MyClass{ public function Myfunction($param){ is_array($param) && $str = implode(",", $param); !is_array($param) && $str = $parm; echo $str."<br/>"; } }