CodeIgniter钩子用法实例详解


Posted in PHP onJanuary 20, 2016

本文实例讲述了CodeIgniter钩子用法。分享给大家供大家参考,具体如下:

CodeIgniter执行流程图中有7个椭圆的框,这表示在执行的过程中埋了7个钩子。那先来看看什么是钩子?

网上找到的两段文字:

钩子的完整实现应该叫事件驱动。事件驱动分为两个阶段,第一个阶段是注册事件,目的是给未来可能发生的“事件”起一个名字,简单的实现方法是用单例模式产生一个持久的对象或者注册一个全局变量,然后将事件名称,以及该事件对应的类与方法插入全局变量即可。也就是挂载一个钩子。

第二个阶段是触发事件,本质上就是在事件的全局变量中查询要触发的事件名称,然后找到注册好的类与方法,实例化并运行。这样子就可以摆脱传统方式中程序必须按顺序的规则,进一步实现解除耦合的目的。

钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

可以看到:

1、钩子函数是预设并在特定的条件下触发的。

2、钩子函数接管程序后可以影响到程序的走向。

CI预设钩子

CI中设定了7个钩子,钩子与钩子之间相对独立。前3个钩子是在实例化之前设定的,意味着无法使用get_instance实例,要使用已实例化的类需要global。7个钩子的作用手册上说的比较清楚了,可以重写缓存输出、可以对输出进行处理等。

如何触发CI钩子?

CI在配置文件中设置了钩子开关,要使用钩子首先得打开该开关,然后配置config/hook.php中的hook数组,比如设置post_controller_constructor钩子:

$hook['post_controller_constructor'] = array(
  'class'  => 'Hook',
  'function' => 'post_controller_constructor',
  'filename' => 'Hook.php',
  'filepath' => 'hooks',
  'params'  => array('beer', 'wine', 'snacks')
);

当控制器实例化之后,调用action之前就会触发去执行hooks目录下的Hook.php中的post_controller_constructor方法。我们可以在该方法中做一些处理。

钩子的应用

到目前为止还未体会到CI钩子的绝妙之处,查看网上有一些应用CI钩子来实现权限控制的程序,即在post_controller_constructor做权限判断,由于这个钩子就好比一个构造函数,在构造函数里判断接下来要执行的方法是否有权限,确实可行。但这个功能也完全可以放在MY_Controller中去实现,甚至会更好。因为CI的钩子是全局的,不管是前台还是后台都会启动该钩子,虽然说这个钩子程序可以做判断,但这里判断不一定是最好的。前面提到过MY_Controller中不同模块公用控制器分开,前台后台继承不同的控制器,如果我只需要对后台进行权限控制,完全可以直接在后台公用控制器中来实现,不影响到前台,只对需要的部分做控制。

这里有个非CI中的例子,思维是一样的。合作渠道的用户登录注册功能,有很多的合作方,不同的合作方需要注册的基本资料相同,但每个合作方可能会有一些特殊的字段或者不同的校验方式。

很多时候碰到问题我们都可以放到日常生活中来看。以注册处理逻辑为例,可以看看其中有个流程是不变的。接受参数->注册资料之前处理->注册->注册资料之后处理。变化的是什么?每一步都可能变化,但流程不变化。所以可以对前、后、处理等相关地方设置钩子,把处理的逻辑分发到特定的情况下去,下面有个参考图,具体的如何设置钩子还需要根据项目来:

CodeIgniter钩子用法实例详解

事实也证明这种方式是可行的,合作方虽然很多,但是也可以分组,上百个注册页面很容易就实现了。所以利用钩子处理这种流程不变,而中间的某个步骤变化多端的需求是很方便的。

简单点说, 钩子就是特定条件下执行一段程序;再简单点,钩子就是实现解除if判断的一种方式。

过多的if判断会导致程序难以阅读和维护,而通过钩子的处理可以让程序更灵活。钩子有一定的触发条件,条件可以是配置、从数据库读取,或者通过一些技术来实现,比如反射等,使用钩子可以达到解耦的目的。

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 PHP
YII CLinkPager分页类扩展增加显示共多少页
Jan 29 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 #PHP
CodeIgniter多语言实现方法详解
Jan 20 #PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 #PHP
教你php如何实现验证码
Jan 20 #PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 #PHP
CodeIgniter扩展核心类实例详解
Jan 20 #PHP
CodeIgniter视图使用注意事项
Jan 20 #PHP
You might like
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
Webkit的跨域安全问题说明
2011/09/13 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
Python httplib模块使用实例
2015/04/11 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
python 实现单例模式的5种方法
2020/09/23 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
幼儿园实习自我鉴定
2013/12/15 职场文书
结婚喜宴主持词
2014/03/14 职场文书
校运会班级霸气口号
2015/12/24 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
如何用python插入独创性声明
2021/03/31 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
python开发的自动化运维工具ansible详解
2021/08/07 Python
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS