这篇文章学习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/>"; } }