💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 事件说明 事件的定义写在`插件名称类`文件里面,方法命名方式以Hook结尾,字母驼峰式命名。 ## 插件能使用的事件 <blockquote class="danger"><p>2.1.220504版本起插件事件不在使用下划线调用,但依然支持旧版的下划线方式</p></blockquote> | 事件名称 | 插件名称类使用方式 | 描述 | 参数说明 | | --- | --- | --- | --- | | ~~addons_init~~<br/>2.1.220504版本起:addonsInit | addonsInitHook | 插件初始化,这个事件能影响到前台、后台,优先级最高 | - | | addonMiddleware | addonMiddlewareHook | 插件全局中间件,只要访问任意插件前台时触发 | 请求的Request对象 | | addonsBegin | addonsBeginHook | 插件路由调度前事件,访问插件控制器时触发 |请求的Request对象 | | addonModuleInit | addonModuleInitHook | 插件控制器初始化前事件,访问插件控制器时触发 |请求的Request对象 | | addonsActionBegin | addonsActionBeginHook | 插件控制器操作方法执行前事件,访问插件控制器操作方法时触发 |传入控制器对象与将要操作的方法 | | indexRoute | indexRouteHook | 访问前台时,在路由初始化时触发, | 无 | | adminRoute | adminRouteHook | 访问后台时,在路由初始化时触发 | 无 | | apiRoute | apiRouteHook | 访问api时时,在路由初始化时触发 | 无 | | configInit |configInitHook| 访问前台或后台时,站点配置初始化后触发(前后台的基础类) | 站点配置 | | adminLoginSuccess |adminLoginSuccessHook| 后台登录成功后标签位 | 登录信息 | | indexHead | indexHeadHook |前台模板头部标签位 | 无 | | indexFooter | indexFooterHook | 前台模板底部标签位 | 无 | |themeChange|themeChangeHook|模板主题切换事件|传入index_theme,或admin_theme| | uploadAfter | uploadAfterHook |文件上传后触发 | 传入文件信息数组 | | uploadDel | uploadDelHook |文件删除后触发 | 传入删除的模型对象 | | ~~addonConfig_save~~| |插件保存配置时触发(已废弃) | 提交的配置表单 | | 插件标识ConfigSave |插件或模板配置保存时触发(2.1.220220新增) | 提交的配置表单,例如你的插件叫:demo, 事件定义为:demoConfigSaveHook| | apiLoginMiddleware | apiLoginMiddlewareHook | API登录中间件 | 请求Request对象 | | apiAuthMiddleware |apiAuthMiddlewareHook | API权限中间件 | 请求Request对象 | |HttpRun|HttpRunHook|应用开始标签位(TP内置)|无| |HttpEnd|HttpEndHook|应用结束标签位(TP内置)|当前响应对象实例| |RouteLoaded|RouteLoadedHook|路由加载完成(TP内置)|无| |LogWrite|LogWriteHook|日志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 "测试"; } } ~~~