// +---------------------------------------------------------------------- declare (strict_types = 1); namespace addon\demo\subscribe; use ywxapp\service\HookService; /** * 模板钩子订阅器(插件侧接入示例) * * eventPrefix='Hook' => onRender() 监听 HookRender(收集型事件) * 需在 info.php 的 events.subscribe 中声明本类(见 addon/demo/info.php)。 * * 两种挂载方式,可混用: * 1. 声明式:HookService::mount('钩子名', 'demo@hook/xxx') —— 可排序、能在后台「模板钩子」页枚举到 * 2. 事件式:onRender() 按 $payload['name'] 返回 HTML —— 适合需要运行时判断的场景 * * 铁律:不输出就返回空字符串,千万别返回 false —— think\Event::trigger() * 遇到 false 会 break,排在后面的插件输出会全部丢失。 */ class Hook { protected $eventPrefix = 'Hook'; public function __construct() { // 声明式挂载:模板 addon/demo/view/hook/score-toolbar.html HookService::mount('backend.score.toolbar', 'demo@hook/score-toolbar'); } /** * HookRender:收集型事件,返回值会被拼进模板埋点 * * @param array $payload ['name' => 钩子名, 'vars' => 模板变量] * @return string|array 字符串,或 ['html' => '...'] */ public function onRender($payload) { $name = (string) ($payload['name'] ?? ''); switch ($name) { case 'backend.score.form': return '