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功能就会触发行为,一定要记得先注册再执行

0 0
原创粉丝点击