ThinkPHP 标签、行为、钩子
一、钩子
钩子配置文件:项目根目录/application/tags.php
在TP3.2
手册中,把 “钩子” 描述为 “标签位”,但是在TP5.1
手册中,“标签位”直接被称为“钩子”
其实,不管是叫“标签位”还是“钩子”,他们的含义都是代表了程序在运行过程中的某一个时刻、某一个位置,
比如:系统核心设计提供的“钩子”
app_init 应用初始化标签位
app_dispatch 应用调度标签位
app_begin 应用开始标签位
module_init 模块初始化标签位
action_begin 控制器开始标签位
view_filter 视图输出过滤标签位
app_end 应用结束标签位
log_write 日志write方法标签位
log_level 日志写入标签位
response_send 响应发送标签位
response_end 输出结束标签位
一个钩子可以注册多个行为,执行到某个钩子(也就是到某个特定的位置)时,
会按照行为注册的顺序,依次执行行为
二、行为
行为其实就是一个动作,他可能是一个匿名函数、类中的一个方法、
三、钩子
<?php
namespace think;
class Hook
{
/**
* @var array 标签
*/
private static $tags = [];
public static function add($tag, $behavior, $first = false)
{
// 添加行为到某个标签下
}
public static function import(array $tags, $recursive = true)
{
// 批量导入插件,就是循环调用add
}
public static function get($tag = '')
{
// 获取插件信息 self::$tags[$tag]
}
public static function listen($tag, &$params = null, $extra = null, $once = false)
{
// 根据标签、循环处理标签包含的所有行为
}
public static function exec($class, $tag = '', &$params = null, $extra = null)
{
// 执行某个标签下的行为;找到行为的对象和方法并执行
}
}
注意事项
1. 数组做加法
import
方法中有一行代码
self::$tags = $tags + self::$tags;
注释:两个数组相加,若数组中存在相同键值的元素,则只保留第一个数组的元素
2. 语法支持
行为不是一定要某个类的方法才行,也可以直接使用匿名函数
Hook::add('user_delete_successed', function ($user) use ($auth) {
Cookie::delete('uid');
Cookie::delete('token');
});
Hook::add
方法中就是把这个匿名函数放在键为 user_delete_successed
的数组中
fastadmin 钩子配置
文件:./application/extra/addons.php
<?php
return array (
'autoload' => false,
'hooks' =>
array (
'testhook' =>
array (
0 => 'markdown',
1 => 'test',
),
),
'route' =>
array (
'/example$' => 'example/index/index',
'/example/d/[:name]' => 'example/demo/index',
'/example/d1/[:name]' => 'example/demo/demo1',
'/example/d2/[:name]' => 'example/demo/demo2',
),
);
testhook
是钩子需要执行的方法,markdown
、test
是钩子标识