ThinkPHP5.1钩子和行为的使用

百度百科的定义(钩子):

    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

    在ThinkPHP5.1中我对钩子函数(Hook)的理解:钩子函数的执行,是在绑定了钩子的函数执行之前先执行的函数,即用钩子钩住感兴趣的函数,只要它要执行,钩子函数就在它之前执行(即类似AOP面向切面编程,其编程思想与java的动态代理设计思想类似ThinkPHP5.1中钩子是插件化开发的基础,钩子的实现分为三个部分来完成:定义钩子、添加钩子、监听钩子。

定义钩子

    在定义钩子之前,我们需要找个合适位置放置钩子。一般的话,可以放置在ThinkPHP5.1模块下的behavior目录下(钩子就是一种行为);也可以在项目的根目录下创建一个放置钩子的文件夹(需要将该文件夹配置到自动加载中),这种方法也是插件化开发使用的方式。我们用behavior目录下创建钩子作为例子,例如我们在index模块behavior目录下创建Test钩子,代码如下(run方法是ThinkPHP5.1钩子定义的默认执行函数):

namespace app\index\behavior;
class Test 
{
    public function run($param)
    {
        // 行为逻辑
        echo $param;
    }
}

添加钩子

    完成了钩子的定义,我们需要配置钩子。ThinkPHP5.1中,配置钩子有两种方式:

方式一、可以在项目的tags.php中配置或者在模块下的tags.php中配置,例如,其中“myhook”是钩子名称,“app\\index\\behavior\\Test”是我们定义的钩子位置。

// 应用行为扩展定义文件
return [
    // 应用初始化
    'app_init'     => [],
    // 应用开始
    'app_begin'    => [],
    // 模块初始化
    'module_init'  => [],
    // 操作开始执行
    'action_begin' => [],
    // 视图内容过滤
    'view_filter'  => [],
    // 日志写入
    'log_write'    => [],
    // 应用结束
    'app_end'      => [],
	'myhook'=> [//自定义标签位
        'app\\index\\behavior\\Test',
    ],
];

方式二、代码如下,中方式注册(配置)的钩子具有很大扩展空间,是插件化开发使用的方式,主要是用在自动注册钩子函数里。

//注册 app\admin\behavior\CronRun行为类到myhook钩子中
Hook::add('myhook','app\\index\\behavior\\Test');

监听钩子

    钩子的监听是放在需要添加钩子的位置之前,监听方如下,其中“myhook”是前面定义的钩子名称,“params”是我们定义Test钩子类run执行函数的参数(可以是一个参数,也可以说数组参数):

Hook::listen('myhook',$params);

上面例子,最后完成的代码如下:

<?php
namespace app\index\controller;
use think\facade\Hook;
use think\Controller;

class Index extends Controller
{
    public function index()
    {
		$arr = [];
		$arr[]='参数1';
		$arr[]='参数2';
		Hook::listen('myhook',$arr,'是否只有一次有效返回值');
		//Hook::listen('myhook','我是参数','是否只有一次有效返回值');
		return $this->fetch();
	}

    public function hello($name = 'ThinkPHP5')
    {
        return 'hello,' . $name;
    }
}
    如果要做视图里使用,需要在公共函数配置里添加如下代码:
/**
 * 处理插件钩子
 * @param string $hook 钩子名称
 * @param mixed $params 传入参数
 * @return void
 */
function hook($hook, $params = [])
{
    Hook::listen($hook, $params);
}
在视图文件里添加如下代码,其中“myhook”是前面定义的钩子名称,“params”是我们定义Test钩子类run执行函数的参数
{:hook("myhook",'测试插件钩子')}

本次例子下载https://pan.baidu.com/s/1UHozwtOV4g2oFqGIH914aw  提取码:s3n9



分享此文到: