thinkphp 钩子的简单实现和总结
2015-09-23 18:05
681 查看
首先,钩子(Hook)是thinkphp中的一种扩展,我们可以将钩子插入框架中的任意位置来执行特定的行为(Behavior)。(按照我个人的拙见,钩子相当于在控制器里面内嵌了一个控制器,但两个控制器的逻辑互不相干,只是刚好同时触发而已)
行为对应着一个固定的标签位置(这一个标签位置是可以通过手动注册以及自动注册来实现的),当使用钩子的监听功能(listen)时,我们就会触发这一个标签位置所对应的行为。
下面我们看一下如何简单地实现一个钩子在Index界面下实现输出Hello, World!
首先,我们先写好自己自定义的标签所代表的行为。(系统中的行为都放在Think\Behaviors中,且对应着内置的标签对应位,如action_begin标签位就是控制器开始标签位)
我们自己定义的标签位可以直接放在Think\Behaviors中,也可以放在应用目录中,比如说Home模块下,新建一个Behaviors的文件夹,在文件夹内新建
标签名+Behavior.class.php
后面记得一定要加上Behavior后缀,为什么呢?
在Hook类中的exec方法是这样定义的
在这里我自己自定义的标签名是echo
其中run函数是必须定义的,因为在Behavior.class.php定义了一个抽象类要求必须要有run函数,记得&符号也是要求的。
写好行为之后我们要先将行为注册之后才能执行。
注册分为手动注册以及自动注册,我们先手动注册该标签(echo)。
在控制器IndexController.class.php中,
如果是自动注册呢,则在Home模块下面的Conf文件夹下新定义一个tags.php批量配置
最后我们开始执行钩子,其中钩子放置的地方是随意的,你可以放在控制器里面或者模板等。
我放置在模板里面。
其中tag函数是定义在公共函数functions.php的一个提供钩子监听功能的函数,我们看一下源码
在注册之后再执行listen功能就会触发行为,一定要记得先注册再执行。
行为对应着一个固定的标签位置(这一个标签位置是可以通过手动注册以及自动注册来实现的),当使用钩子的监听功能(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
<?php namespace 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中,
<?php namespace 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批量配置
<?php return 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功能就会触发行为,一定要记得先注册再执行。
相关文章推荐
- OLAP与OLTP介绍
- URL::to() 与 URL::toRoute()
- php设计模式----工厂模式
- PHP大小写:函数名和类名不区分,变量名区分
- php实现简易聊天室应用代码
- ThinkPHP学习
- PHP error_reporting() 错误控制函数功能详解
- 利用PHP如何实现Socket服务器
- ubantu下配置ftp服务器
- 安装ecshop2.7时候的错误处理 php版本不兼容引起
- php防注入xss攻击
- php 详解spl_autoload_register()函数
- NRPE: Unable to read output 常见问题
- 10个超级有用的PHP代码片段果断收藏
- 两种不同版本的防注入函数
- thinkphp框架使用支付宝
- executing preg_match_all() function with this Regular Expression causes a PHP Segmentation Fault.
- ThinkPHP3.2中关联查询的代码收藏
- php常用的安全过滤函数
- php中session_id()函数详细介绍,会话id生成过程及session id长度