主题
11 钩子系统
原理
HookService 在业务关键点触发钩子,插件通过 hooks.php 中 add_hook() 订阅。
php
// 业务侧
HookService::trigger('AfterInvoicePaid', ['invoice_id' => 1, ...]);
// 插件 hooks.php
add_hook('after_invoice_paid', function ($param) {
// 与 AfterInvoicePaid 等价(snake_case 自动映射)
});注册方式
| 方式 | 说明 |
|---|---|
| 代码 | HookService::add() / add_hook() |
| 数据库 | kd_hooks 表(class + method,插件安装时可写入) |
启用插件时 PluginService::boot() 自动 include hooks.php。
魔方别名
| 系统钩子 | 额外触发名 |
|---|---|
| AfterInvoicePaid | order_paid |
| AfterUserRegister | register_after |
| AfterTicketOpen | ticket_create_after |
| AfterTicketReply | ticket_reply_after |
| AfterModuleCreate | module_create_after |
| AfterHostRenew | host_renew_after |
常用钩子列表
| 钩子 | 触发位置 | 参数示例 |
|---|---|---|
| UserLogin | 用户登录 | user_id |
| AdminLogin | 管理员登录 | admin_id |
| AfterUserRegister | 注册成功 | user_id |
| AfterOrderCreate | 订单创建 | order_id, user_id |
| AfterInvoicePaid | 账单支付 | invoice_id, user_id |
| AfterModuleCreate | 自动开通成功 | host_id, module |
| ModuleCreateFailed | 开通失败 | host_id, error |
| AfterTicketOpen | 工单创建 | ticket_id, user_id |
| AfterTicketReply | 工单回复 | ticket_id |
| AfterAddonInstall | 插件安装 | name |
| AfterAddonUninstall | 插件卸载 | name |
| AfterUpgrade | 系统更新 | to_build |
插件示例
php
// public/plugins/addon/order_notify/hooks.php
add_hook('order_paid', function ($param) {
OrderNotify::onPaid($param);
});优先级:数字越小越先执行(默认 50)。
注意事项
- 钩子内避免长时间阻塞;发邮件用
NotifyService::sendMailQuiet() - 抛异常会被
HookService捕获并写 trace 日志,不中断主流程 - 命名推荐 snake_case,与魔方插件保持一致
下一章:12-API 与路由