Skip to content

11 钩子系统

原理

HookService 在业务关键点触发钩子,插件通过 hooks.phpadd_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


魔方别名

系统钩子额外触发名
AfterInvoicePaidorder_paid
AfterUserRegisterregister_after
AfterTicketOpenticket_create_after
AfterTicketReplyticket_reply_after
AfterModuleCreatemodule_create_after
AfterHostRenewhost_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)。


注意事项

  1. 钩子内避免长时间阻塞;发邮件用 NotifyService::sendMailQuiet()
  2. 抛异常会被 HookService 捕获并写 trace 日志,不中断主流程
  3. 命名推荐 snake_case,与魔方插件保持一致

下一章:12-API 与路由

KeDe Finance · 纯 PHP 自研财务系统