开发指南

扩展点手册

扩展点(Hook)是 Tenraft 的一等公民:内核与应用在关键流程发布事件,插件订阅介入——二开不改源码,升级不冲突。本章讲机制与事件目录。

三种事件类型

类型执行方式用途
filter(同步过滤)监听器按优先级链式执行,可修改载荷并返回,也可标记取消支付方式列表过滤、下单前风控、通知内容改写、AI 输入审核
sync(同步阻塞)内联执行,监听器抛异常可中止业务流程升级前自检(不兼容直接拦下升级)
action(异步)入 Redis 队列由消费进程执行;至少一次投递发通知、统计、审计旁路

订阅方式

应用与插件在包内 server/hooks.php 返回「事件名 → 监听器列表」映射,安装时登记、卸载时自动回收:

server/hooks.php(商城应用实例)

<?php

return [

// 事件名 => [[监听器类, 优先级], ...]

'pay.paid' => [

[\apps\shop\hook\OrderPaidPrintListener::class, 100],

],

];

  • 命名规范:域.对象.动作,全小写点分;载荷为类型化的载荷对象(filter 型返回修改后的载荷)。
  • 开发环境用 php webman hook:list 查看全部事件与已注册监听器。
  • 事件目录带稳定性标记stable 事件主版本内保持兼容;experimental 事件的载荷形状可能调整,生产插件优先订阅 stable 事件。

事件目录

租户、站点与扩展生命周期

事件类型说明
tenant.created / tenant.disabled / tenant.removedaction租户生命周期
site.created(stable)/ site.enabled / site.disabled / site.expired / site.deletedaction站点生命周期
app.installed / app.upgraded / app.uninstalled / app.enabled / app.disabled(stable)action应用部署级生命周期
app.site.bound / app.site.unbound(stable)action站点绑定 / 解绑应用
addon.installed / addon.upgraded / addon.uninstalled / addon.enabled / addon.disabled / addon.site.enabled / addon.site.disabled(stable)action插件生命周期与站点开关
upgrade.before / upgrade.aftersync升级前后;before 抛异常可中止升级

会员与资产

事件类型说明
member.registered / member.loginaction注册与登录(含渠道信息)
member.account.changedaction资产变动后:账户类型、方向、金额、来源

交易与支付

事件类型说明
pay.ways.filterfilter支付方式列表组装后,可增删排序
pay.prepay.beforefilter下单前干预(风控卡点,可取消)
pay.paidaction支付成功(业务 handler 之外的旁路订阅)
pay.refundedaction退款成功
trade.created / trade.closedaction交易创建 / 关单

通知、内容与其他

事件类型说明
notice.send.beforefilter可改写模板变量或拦截发送
notice.sentaction发送完成(含结果)
diy.page.publishedaction装修发布(home / member / custom 三种页面)
form.submittedaction万能表单收到提交
ai.input.filterfilterAI 输入审核,标记取消即拒发
ai.message.completedactionAI 生成完成
wxopen.authorized / wxopen.unauthorized / wxopen.releasedaction第三方平台授权变更与发布完成
admin.login / admin.operation.afteraction管理端审计旁路

实践建议

  • filter 里不做慢操作——同步链路上的监听器直接拉长接口响应时间;重活丢给 action 事件异步处理。
  • 不要在监听器里再发同一事件,避免环路。
  • 监听器抛异常:filter / sync 型中断链路并向业务返回错误;action 型进入失败队列可重放(queue:failed 管理)。
  • 订阅了资产 / 支付类事件的插件,上线前务必用沙箱交易全链路演练一次。