thinkphp 钩子的简单实现和总结
来源:互联网 发布:文档解密软件 编辑:程序博客网 时间:2024/05/08 19:21
首先,钩子(Hook)是thinkphp中的一种扩展,我们可以将钩子插入框架中的任意位置来执行特定的行为(Behavior)。(按照我个人的拙见,钩子相当于在控制器里面内嵌了一个控制器,但两个控制器的逻辑互不相干,只是刚好同时触发而已)
行为对应着一个固定的标签位置(这一个标签位置是可以通过手动注册以及自动注册来实现的),当使用钩子的监听功能(listen)时,我们就会触发这一个标签位置所对应的行为。
下面我们看一下如何简单地实现一个钩子在Index界面下实现输出Hello, World!
首先,我们先写好自己自定义的标签所代表的行为。(系统中的行为都放在Think\Behaviors中,且对应着内置的标签对应位,如action_begin标签位就是控制器开始标签位)
我们自己定义的标签位可以直接放在Think\Behaviors中,也可以放在应用目录中,比如说Home模块下,新建一个Behaviors的文件夹,在文件夹内新建
标签名+Behavior.class.php
后面记得一定要加上Behavior后缀,为什么呢?
在Hook类中的exec方法是这样定义的
static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ // 行为扩展必须用run入口方法 $tag = 'run'; } $addon = new $name(); return $addon->$tag($params); }
在这里我自己自定义的标签名是echo
<?phpnamespace Home\Behaviors;use Think\Behavior;class echoBehavior extends Behavior{ public function run(&$arg){ echo "Hello ".$arg['name']; }}
其中run函数是必须定义的,因为在Behavior.class.php定义了一个抽象类要求必须要有run函数,记得&符号也是要求的。
abstract class Behavior { /** * 执行行为 run方法是Behavior唯一的接口 * @access public * @param mixed $params 行为参数 * @return void */ abstract public function run(&$params);}
写好行为之后我们要先将行为注册之后才能执行。
注册分为手动注册以及自动注册,我们先手动注册该标签(echo)。
在控制器IndexController.class.php中,
<?phpnamespace Home\Controller;use Think\Controller;use Think\Hook;class IndexController extends Controller { public function index(){ Hook::add('echo', "Home\\Behaviors\\echoBehavior"); //调用Hook中的静态方法add进行注册 $this->display(); }}
如果是自动注册呢,则在Home模块下面的Conf文件夹下新定义一个tags.php批量配置
<?phpreturn array( 'echo' => array('Home\\Behaviors\\echoBehavior') );
最后我们开始执行钩子,其中钩子放置的地方是随意的,你可以放在控制器里面或者模板等。
我放置在模板里面。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>钩子</title></head><body> {:tag('echo', array('name'=>'World'))}</body></html>
其中tag函数是定义在公共函数functions.php的一个提供钩子监听功能的函数,我们看一下源码
function tag($tag, $params=NULL) { \Think\Hook::listen($tag,$params);}
在注册之后再执行listen功能就会触发行为,一定要记得先注册再执行。
- thinkphp 钩子的简单实现和总结
- ThinkPHP的钩子实现原理
- C#钩子实现简单鼠标键盘的监控和屏蔽
- 钩子的类型和实现
- 钩子的类型和实现
- 钩子的类型和实现
- 钩子的类型和实现
- 钩子的类型和实现
- 钩子的类型和实现
- WM_COPYDATA和鼠标钩子的简单例子
- php钩子和简单的分发方式
- 简单叙述钩子实现
- 简单叙述钩子实现
- 钩子的类型和实现[转]
- 钩子的类型和实现(转)
- 钩子的类型和实现(续)
- (转)钩子的类型和实现
- 钩子的简单应用
- 简单适配+静态库+SVN
- 通过Context查找TextView Button
- mysql 批量更新临时表中的数据
- 编程面试的10大算法概念汇总
- javascript系列(3)-在html的文档模式
- thinkphp 钩子的简单实现和总结
- Tomcat启动真正完成后,执行方法
- java Socket通信(一)
- YARN/MRv2 MRAppMaster深入剖析—推测执行机制
- 第4周—项目4 建立双链表算法库
- jquery-join()
- Linux如何查看进程、杀死进程、启动进程等常用命令
- attribute/device_attribute/driver_attrivute ...
- 【转】JXL: Java Excel API简易教程