一、钩子

钩子配置文件:项目根目录/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 是钩子需要执行的方法,markdowntest 是钩子标识