[开发]02 · Hooks 目录(全部钩子速查)

👑Lv.11 元老 🌞 骨干会员
2026-10-24 00:08:07

本文由 FlintHub 开发文档归档发布。原始文档日期见标题前缀,来源:8月12日的备份/update/9/sosite-plugin-dev/references/02-hooks-catalog.md。

02 · Hooks 目录(全部钩子速查)

钩子机制:Plugin::hook('name', $params) 遍历已启用插件,include 注册的 hook 文件。

hook 文件内可用变量:$params 经 extract(EXTR_SKIP | EXTR_REFS) 注入 + 调用点作用域变量(如 $router、$view)。

单个 hook 抛异常会被 try/catch 捕获,不影响页面继续运行(error_log 记录)。

路径安全:hook 文件必须位于插件目录内(realpath 校验,防穿越),违规直接跳过。

初始化与全局

Hook触发点可用变量/参数典型用途
init_afterapp/init.php 插件初始化后—一次性初始化(注意:建议建表放 activate,懒初始化才放这里)
controller_view_beforeController::view() 渲染前template(视图名)、data(引用,可改数据)注入全局数据、改视图参数

路由与导航

Hook触发点可用变量/参数典型用途
route_register前台路由注册(index.php,dispatch 前)$router注册前台 GET/POST 路由
route_before_dispatch路由匹配执行前(index.php)$router路由前拦截/全局处理
route_after_dispatch路由执行后(index.php,请求收尾)—请求后处理(计数落库等)
admin_route_register后台路由注册$router注册后台路由(URL 不带 /admin 前缀)
admin_sidebar_links后台侧边栏(扩展组内)$view($GLOBALS['__view'])输出后台侧边栏入口 <a>
nav_main_links前台主导航栏$view输出顶部导航链接
nav_plugin_links前台"应用"下拉 + 左栏$view(可 null)输出应用入口链接($view->icon() + 名称)
nav_user_menu_items前台用户下拉菜单(移动端头像菜单,个人中心之后)$view($GLOBALS['__view'])输出用户菜单入口(我的收藏/审核通知/签到等);⚠️ 曾因核心无触发点不生效,2026-08-09 已在 app/Views/layouts/main.php 补触发点

页面注入

Hook触发点可用变量/参数典型用途
layout_head_end</head> 前$view、$bp(BASE_PATH)注入 CSS/JS/元信息(可用 $this->url() 生成路径)
home_sidebar_bottom前台侧边栏"友情链接"区—侧边栏底部内容(移动/桌面两处都触发)
announcements_display首页/版块页公告区—输出公告条

用户行为

Hook触发点参数典型用途
auth_login_after登录成功后user_id、username登录后联动(积分、日志)
auth_register_before注册校验前—注册前置校验(如邀请码);错误传 $GLOBALS['auth_register_error'],非空即拦截
auth_register_after注册成功后user_id、username、email注册后联动
avatar_upload_after头像上传成功后user_id、avatar(新文件名)、old_avatar头像审核等

内容行为(发帖/回帖/编辑)

Hook触发点参数典型用途
thread_create_after发新帖成功后thread_id、user_id、category_id发帖联动
post_create_after回帖成功后post_id、thread_id、user_id回帖联动
thread_edit_after编辑主题保存后thread_id、user_id编辑联动
post_edit_after编辑回复保存后post_id、thread_id、user_id编辑联动

附件下载

Hook触发点参数典型用途
attachment_download_before附件下载控制器输出文件前(AttachmentController::download)attachment(attachments 行 + category_id)、user_id(可 null)积分下载、付费下载等下载前拦截;约定:插件置 $GLOBALS['attachment_download_error'] 非空字符串即终止下载(403 提示),模仿 auth_register_before 的全局传错方式

完整 Hooks 清单(按源码触发点核对,2026-08-09)

Hook触发文件
init_afterapp/init.php
controller_view_beforeapp/Core/Controller.php
route_registerapp/init.php(插件系统加载时)
admin_route_registerapp/init.php(后台初始化时)
admin_sidebar_linksapp/Views/admin/_sidebar.php
nav_main_linksapp/Views/layouts/main.php
nav_plugin_linksapp/Views/layouts/main.php + app/Views/_components/left_sidebar.php(两处)
nav_user_menu_itemsapp/Views/layouts/main.php(用户下拉菜单,2026-08-09 补)
layout_head_endapp/Views/layouts/main.php
home_sidebar_bottomapp/Views/_components/right_sidebar.php + mobile_sidebar.php(两处)
announcements_displayapp/Views/home/index.php + app/Views/forum/index.php(两处)
auth_login_afterapp/Controllers/AuthController.php
auth_register_beforeapp/Controllers/AuthController.php
auth_register_afterapp/Controllers/AuthController.php
avatar_upload_afterapp/Controllers/ProfileController.php
thread_create_afterapp/Controllers/PostController.php
post_create_afterapp/Controllers/ThreadController.php
thread_edit_afterapp/Controllers/ThreadController.php
post_edit_afterapp/Controllers/PostController.php

注意事项

  • 同一 hook 名多处触发(如 nav_plugin_links 两处):hook 文件会被 include 两次,输出内容会重复——若需避免,用静态变量守卫或只输出一次的内容放 init_after
  • auth_register_before 传错用全局变量约定:$GLOBALS['auth_register_error'] = '错误信息';
  • 钩子内 echo 直接输出到响应体;不要 exit/die(会终止整页)
  • 钩子内如需当前视图对象:$view = $GLOBALS['__view'] ?? null;(可能为 null,需兜底)
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 2 次 | 回复 0 次

全部回复 (0)

暂无回复

请 登录