php優秀框架codeigniter學習系列——hooks

  這篇文章學習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/>";
    }
    
}
相關文章
相關標籤/搜索