Hkcms 插件事件

事件说明

事件的定义写在插件名称类文件里面,方法命名方式以Hook结尾,字母驼峰式命名。

插件能使用的事件

2.1.220504版本起插件事件不在使用下划线调用,但依然支持旧版的下划线方式

事件名称插件名称类使用方式描述参数说明
addons_init
2.1.220504版本起:addonsInit
addonsInitHook插件初始化,这个事件能影响到前台、后台,优先级最高-
addonMiddlewareaddonMiddlewareHook插件全局中间件,只要访问任意插件前台时触发请求的Request对象
addonsBeginaddonsBeginHook插件路由调度前事件,访问插件控制器时触发请求的Request对象
addonModuleInitaddonModuleInitHook插件控制器初始化前事件,访问插件控制器时触发请求的Request对象
addonsActionBeginaddonsActionBeginHook插件控制器操作方法执行前事件,访问插件控制器操作方法时触发传入控制器对象与将要操作的方法
indexRouteindexRouteHook访问前台时,在路由初始化时触发,
adminRouteadminRouteHook访问后台时,在路由初始化时触发
apiRouteapiRouteHook访问api时时,在路由初始化时触发
configInitconfigInitHook访问前台或后台时,站点配置初始化后触发(前后台的基础类)站点配置
adminLoginSuccessadminLoginSuccessHook后台登录成功后标签位登录信息
indexHeadindexHeadHook前台模板头部标签位
indexFooterindexFooterHook前台模板底部标签位
themeChangethemeChangeHook模板主题切换事件传入index_theme,或admin_theme
uploadAfteruploadAfterHook文件上传后触发传入文件信息数组
uploadDeluploadDelHook文件删除后触发传入删除的模型对象
addonConfig_save
插件保存配置时触发(已废弃)提交的配置表单
插件标识ConfigSave插件或模板配置保存时触发(2.1.220220新增)提交的配置表单,例如你的插件叫:demo, 事件定义为:demoConfigSaveHook
apiLoginMiddlewareapiLoginMiddlewareHookAPI登录中间件请求Request对象
apiAuthMiddlewareapiAuthMiddlewareHookAPI权限中间件请求Request对象
HttpRunHttpRunHook应用开始标签位(TP内置)
HttpEndHttpEndHook应用结束标签位(TP内置)当前响应对象实例
RouteLoadedRouteLoadedHook路由加载完成(TP内置)
LogWriteLogWriteHook日志write方法标签位(TP内置)当前写入的日志信息

使用方式

例如插件名称叫demo,在Demo插件名称类里面,若要使用indexHead前台模板头部事件。这里首先需要模板有放置该标签事件,可前往默认模板找到head.html文件,即可看到{:hook("indexHead")},当访问前台页面执行到{:hook("indexHead")}时就会调用下面的indexHeadHook方法。

完整写法如下

<?php
declare (strict_types=1);namespace addons\demo;use think\Addons;class Demo extends Addons{
    public function install()
    {
        return true;
    }

    public function uninstall()
    {
        return true;
    }

    // 前台模板执行到<head></head>时触发,通常用于加载JS、CSS达到特定的需求
    public function indexHeadHook()
    {
        // 加载js
        return "<script src='/static/main.js'></script>";
        // 或直接渲染视图,可参考插件视图
        return $this->fetch('index/index');
    }}

扩展

当我们在写业务逻辑时,需要自己定义一些事件标签位来给其他插件实现功能扩展,那么我们可以参考下面来实现。
1. hook方法
系统有提供hook方法来触发事件,方法说明:

/**
 * $event 事件名称
 * $params 传入参数
 * $once = true 表示返回一个结果,$once = false 表示返回全部结果
 * $original = true 表示 返回TP trigger原始数据,false - 返回字符串,如果原样返回数据是数组即会转换成字符串
 */hook($event, $params, $once, $original)

2. 触发事件
例如定义触发showTest事件。

// 控制器触发,传入数组hook('showTest', ['a'=>'测试']);// 模板触发,传入数组{:hook("showTest",['a'=>'测试'])}// 接收返回值:输出原始数据。第四个参数给true即可$arr = hook("showTest",['a'=>'测试'],true,true);

注意:当有多个插件定义showTest事件时,返回值是数组的,并不建议这样来使用事件

上面定义了showTest触发事件方法,那么在其他插件就可以定义showTest事件来实现扩展,如下

<?php
declare (strict_types=1);namespace addons\demo;use think\Addons;class Demo extends Addons{
    public function install()
    {
        return true;
    }
    public function uninstall()
    {
        return true;
    }

    // 对应showTest
    public function showTestHook()
    {
        echo "测试";
    }}



本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com