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 相关文章推荐
收藏的一个php小偷的核心程序
Apr 09 PHP
php daodb插入、更新与删除数据
Mar 19 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
探讨Hessian在PHP中的使用分析
Jun 13 PHP
PHP将XML转数组过程详解
Nov 13 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
php array_values 返回数组的值实例详解
Nov 17 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
实例讲解PHP页面静态化
Feb 05 PHP
PHP中的自动加载操作实现方法详解
Aug 06 PHP
php5与php7的区别点总结
Oct 11 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
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
PHP中list方法用法示例
2016/12/01 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
asp批量修改记录的代码
2008/06/25 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
python模拟实现分发扑克牌
2020/04/22 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
《有趣的发现》教学反思
2014/04/15 职场文书
学校督导评估方案
2014/06/10 职场文书
违纪检讨书
2015/01/27 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript