百度百科的定义(钩子):
钩子(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);
}
{:hook("myhook",'测试插件钩子')}
木庄网络博客(2016/10/28 11:41:03)
不错的网站主题,看着相当舒服