有些时候我们可能希望在程序执行流程中的某些阶段添加一些动作,例如在控制器加载之前或之后执行一段脚本,或者在其他的某些位置触发脚本。
在Laravel中,可通过中间件实现。CI框架提供的钩子类似Laravel的中间件,当然除使用钩子外,通过继承My_controller也能实现部分类似功能。
总结来讲,CI框架可以通过Hook钩子,实现在不修改系统核心文件的基础上来改变或增加系统的核心运行功能, 下面来看具体使用方法。
CI框架提供了7个可用的预设挂钩点,分别是:
pre_system 指在系统加载前期的钩子
pre_controller 调用自己写的控制器之前调用的钩子,此时所用的基础类、路由选择和安全性检查都已完成
post_controller_constructor 在自己写的控制器实例化之后,任何方法调用之前调用
post_controller 在自己写的控制器完全运行之后调用
display_override 重写display
cache_override 重写缓存
post_system 最终的页面发送到客户端之后
钩子特性可以在 application/config/config.php 文件中全局的启用或禁用, 设置下面这个参数:
$config['enable_hooks'] = TRUE;
钩子是在 application/config/hooks.php 文件中被定义的,每个钩子可以定义 为下面这样的数组格式,数组的索引为你想使用的挂钩点名称:
$hook['xx'] = array(
'class' => 'xx', //钩子调用的类名,可以为空
'function' => 'xx',//钩子调用的函数名
'filename' => 'xx',//该钩子的文件名
'filepath' => 'xx',//钩子的目录
'params' => 'xx'//传递给钩子的参数
);
比如
$hook['post_controller'] = array(
'class' => 'AutomaticLocation',
'function' => 'autoload',
'filename' => 'AutomaticLocation.php',
'filepath' => 'hooks',
'params' => 'array()'
);
详细说明
class 你希望调用的类名,如果你更喜欢使用过程式的函数的话,这一项可以留空。
function 你希望调用的方法或函数的名称。
filename 包含你的类或函数的文件名。
filepath 包含你的脚本文件的目录名。 注意: 你的脚本必须放在 application/ 目录里面,所以 filepath 是相对 application/ 目录的路径,举例来说,如果你的脚本位于 application/hooks/,那么 filepath 可以简单的设置为 'hooks' ,如果你的脚本位于 application/hooks/utilities/ , 那么 filepath 可以设置为 'hooks/utilities' ,路径后面不用加斜线。
params 你希望传递给你脚本的任何参数,可选。
创建AutomaticLocation.php
class AutomaticLocation{
private $CI;
public function __construct(){
$this->CI = &get_instance();
}
public function autoload(){
echo 111;
}
}
这时可以在每次控制器完全运行之后输出111
hook.php中使用二维数组,还可以对同一个挂载点多次引用
$hook['post_controller'][] = array(
'class' => 'AAA',
'function' => 'autoload',
'filename' => 'AAA.php',
'filepath' => 'hooks',
'params' => 'array()'
);
$hook['post_controller'][] = array(
'class' => 'BBB',
'function' => 'autoload',
'filename' => 'BBB.php',
'filepath' => 'hooks',
'params' => 'array()'
);
这可以让你在同一个挂钩点处执行多个脚本,多个脚本执行顺序就是你定义数组的顺序。
也可以使用 lambda 表达式/匿名函数(或闭包)作为钩子,这样写起来更简单:
$hook['post_controller'] = function()
{
/* do something here */
};
参考文章:https://www.cnblogs.com/ohmygirl/p/CIRead-6.html
下一篇:最后一页