TP框架下钩子HOOK函数的出现原因

钩子概念对初学者来说可能比较抽象难懂,但是只要掌握了他的工作方式,那么自己动手写一个钩子机制也不难。

Hook这个词很有意思,以下引用自某网络词典:

Hook用作名词时意思是“钩”,转化为动词时可表示把某物弯成钩形,也可表示用弯曲的东西把某物体钩住,引申可表示为“吊”“挂”等。

作为一个程序猿,老高对钩子的解释是,他就是一个触发机制,把你的软件功能想象成一个陷阱,放到##系统流程##可能经过的路上,如果陷阱被系统踩到,就会执行你的程序,当你挂载的钩子执行完后,系统会根据你的程序的结果继续运行。

老高最早接触Hook的编程思想是源于windows,当时打dota很入迷,突然想研究一下改键的原理,于是发现了系统钩子这一说法。

改键的原理,简单地说来就是拦截系统按下键盘时的默认动作,如果需要把小键盘的7映射到Q上,就在拦截时做一个判断,如果的键码是小键盘7,就改为Q的键码,最后发送给系统修改后的键码,即完成了改键操作。

钩子机制的使用在很多系统上都有体现,如windows、wordpress、thinkphp等,由钩子实现的功能在wordpress中叫做插件,在TP中叫做行为。

老高认为,钩子在MVC模式下十分重要,他实现了在不改变源代码的前提下提升系统的灵活性,如,在文章输出前打印版权信息,在文章输出后生成二维码信息,app运行前检查用户权限,还有更多产品经理提出的变态要求,都可以

掌握了钩子的原理后,那么实现起来就很简单了,TP只花了不到100行代码就搞定了,下面我们分析一下:

首先,我们要明确一些说法。在TP中,设置陷阱的过程称为##绑定事件##,而某个事件触发的功能函数称为##行为##。

钩子应该具有的基本方法应该有:

  • 设置钩子(导入钩子)
  • 触发事件
  • 执行行为

源代码位于ThinkPHP/Library/Think/Hook.class.php,Hook类中全是静态方法,其中有唯一静态属性$tags,他是一个数组,键为绑定的事件,值为绑定的行为。

thinkphp5 hook钩子用法

1、新建一个钩子目录在项目模块下
2、在钩子目录中新建钩子文件
例:
<?php
/**
 * User:       : lims
 * Date:       : 2018/6/26
 * Time:       : 下午2:28
 * Effect      :
 */
namespace app\index\hook;
use app\index\model\Member;
class Test
{
    public function run($parms){
        print_r(Member::getAll());
    }
    public function hello($parms){
        print_r(Member::getAll());
    }
    public function showTime($parms){
        print_r($parms);
    }
}
//此类与controller类可直接相同运行
挂钩用法
公共方法下注册
\think\Hook::add("showTime","\\app\\index\\hook\\Test");
在tags.php中注册
return [
    // 应用初始化
    'app_init'     => [],
    // 应用开始
    'app_begin'    => [],
    // 模块初始化
    'module_init'  => [],
    // 操作开始执行
    'action_begin' => [],
    // 视图内容过滤
    'view_filter'  => [],
    // 日志写入
    'log_write'    => [],
    // 应用结束
    'app_end'      => [],
    "hello"   => ['\\app\\index\\hook\\Test'],
];
 
注册完成就可以监听了
 
Hook::listen("hello");
Hook::listen("showTime");
 

猜你喜欢

转载自blog.csdn.net/u010433704/article/details/89012834