## 插件钩子 本框架的插件钩子,请采用驼峰法函数的方式去编写,首字母小写, 以下是系统默认自带的一些钩子,有一些是预留的,请勿使用; |序号 |钩子 |类型 |描述 | |:--| |1 |apiAuth |插件 |API插件鉴权钩子,插件独占 | |2 |userLoginSuccess |系统 |用户登录成功触发钩子 | |3 |cmsHotSearch |插件 |CMS热词搜索插件,插件独占 | |4 |cmscategoryPermissions |插件 |CMS栏目权限插件,插件独占 | |5 |smsMsgSend |系统 |短信发送的钩子,用于阿里云/腾讯云短信发送 | |6 |uploadFileAfter |系统 |附件上传后执行的钩子 | |7 |uploadFileMultipart |系统 |大文件分片上传/每个分片上传后 | |8 |adminLoginError |系统 |后台管理员登录错误 | |9 |adminLoginSuccess |系统 |后台管理员登录成功/可以对接微信公众号提醒 | |10 |userLoginError |系统 |用户登录成功触发钩子 | ``` 以上钩子中,系统的钩子可以编写插件进行数据的调用执行/返回,插件独占的钩子是专为官方开发插件预留的 如果以上的钩子不满足你的需求,可以加群68221484提交反馈,我们可以增加一些你业务上常用的钩子/事件 ``` 使用事件时在 `Worker.php` 中添加上对应的方法,在安装时、禁用、启用即可自动注册行为。但一定请注意在 `Worker.php` 中编写事件访问为 `public` 类型 ## 监听事件 当前以 `工单管理系统` 为例,文件路径在 `/plugin/worker/Worker.php` ,文件内容如下 ``` <?php namespace plugin\worker; use app\PluginController; /** * */ class Worker extends PluginController { /** * 插件安装方法 * @return bool */ public function install(): bool { return true; } /** * 插件卸载方法 * @return bool */ public function uninstall(): bool { return true; } /** * 插件启用方法 * @return bool */ public function enabled(): bool { return true; } /** * 插件禁用方法 * @return bool */ public function disabled(): bool { return true; } /** * 文件上传事件 * @param $param * @return void */ public function uploadFileAfter($param) { // TODO .. } } ``` `uploadFileAfter` 事件钩子,这样在初始化的时候,框架会监听这个钩子的调用,其实你就把他理解为一个插槽 当用户需要的时候,会去检查这个钩子是否存在,如果存在则执行这个函数。 ## 触发事件 我们拿当前这个上传函数的事件来举例说明,当前框架已经监听到这个事件了,那么要如何触发? 例如:用户头像上传后,我们需要上传至阿里云等附件存储空间,那么则需要这样去触发事件来执行, ``` /** * 用户头像上传 * @param object $file * @return array|false */ public function avatar(object $file) { $this->getFileSavePath($file, 'avatars'); if (!$file->move($this->filepath, $this->filename)) { $this->setError('请检查服务器读写权限!'); return false; } $this->Images->thumb($this->filepath, $this->filename, $this->config, true); Event::emit('uploadFileAfter', [ 'fileName' => $this->filename, 'resource' => $this->resource ]); $this->uploadAfterDelete(); return $this->success('文件上传成功!', $this->resource); } ``` 触发事件执行的方式有很多,但基本上最后执行的都是一样的,所以请统一使用 `Event::emit` 触发即可 更新于 2026-08-09 15:53 阅读 2 ← 控制器模型 插件菜单 → 相关问题 插件简介 新建插件 插件目录 插件配置 控制器模型 插件菜单 插件数据库 代码生成