HookPHP项目目录结构全解析:看懂9大目录,理清热插拔架构设计思路
【免费下载链接】HookPHPHookPHP基于C扩展搭建内置AI编程的架构系统-支持微服务部署|热插拔业务组件-集成业务模型|权限模型|UI组件库|多模板|多平台|多域名|多终端|多语言-含常驻内存|前后分离|API平台|LUA QQ群:679116380项目地址: https://gitcode.com/gh_mirrors/ho/HookPHP
HookPHP 是一款基于 Yaf C 扩展搭建的 PHP 框架,内置热插拔业务组件与微服务部署能力。刚拿到这个项目,是不是被一堆目录搞得眼花缭乱?别担心!本文用9 大目录带你一图看懂 HookPHP 的目录结构,10 分钟理清它的热插拔架构设计思路,零基础也能快速上手。
📁 一分钟总览:9大目录结构图
先把整棵"目录树"放在这里,后文逐个拆解:
HookPHP/ ├── public/ # ① Web 入口目录(唯一对外窗口) ├── config/ # ② 配置中心(MySQL / Redis) ├── app/ # ③ 应用核心(大脑) │ ├── Bootstrap.php # 启动引导器 │ ├── controllers/ # ④ 全局控制器 │ ├── views/ # ⑤ 全局视图模板 │ ├── models/ # ⑥ 数据模型层 │ ├── library/ # ⑦ 基础类库(Module / Hook) │ ├── modules/ # ⑧ 热插拔模块区 ⭐ │ ├── plugins/ # ⑨ 插件(钩子插件) │ └── services/ # 业务服务层 ├── runtime/ # 运行时目录(缓存 / 日志) ├── composer.json # 依赖清单 └── hookphp.sql # 数据库初始化脚本💡一句话记忆:public/管入口,config/管配置,app/管一切业务,runtime/管运行痕迹。
🚪 public/ 目录:唯一的 Web 入口
public/是整个应用对外暴露的唯一窗口,Web 服务器的根目录应指向这里。
- public/index.php:全局唯一入口文件。它定义了
APP_PATH、加载 Composer 自动加载,然后创建Yaf\Application并调用bootstrap()->run()启动整个框架。 robots.txt与sitemap.xml:为搜索引擎准备的 SEO 文件,说明项目对多平台、多站点场景的友好设计。
⚙️ config/ 目录:配置中心如何连接 MySQL 与 Redis
config/只放两个配置文件,但作用关键:
| 文件 | 职责 |
|---|---|
| config/app.php | 应用配置,自动扫描app/modules/下所有目录并注册为模块 |
| config/database.php | 数据库配置,内置 MySQL 与 Redis(default业务库 +cache缓存库)双连接 |
🔑 热插拔的第一块拼图就藏在app.php里:它用glob()遍历app/modules/*,意味着你新建一个模块目录,它就自动被注册,无需手工改任何配置。
🧠 app/ 目录:应用大脑的 5 步启动流程
app/是核心中的核心,先看总调度员 app/Bootstrap.php。它在框架启动时依次执行 5 个初始化步骤:
_initLoader:为Services、Extensions和每一个模块注册命名空间,模块代码从此"开箱即达";_initPlugin:注册HookPlugin钩子插件(后文详述);_initDatabase:建立数据库连接并注入注册表;_initModel:初始化HookModel、ModuleModel两个模型;- 其余
_init*步骤按字母序自动执行。
启动顺序、依赖注入全靠它编排,是理解框架运转的钥匙。
app/controllers/ 与 app/views/:全局默认页面区
存放不属于任何模块的全局页面:
- app/controllers/Index.php:默认首页控制器;
- app/views/index/index.phtml:默认首页视图。
它们和模块内部的控制器、视图完全隔离,职责清晰不越界。
app/models/ 目录:数据模型层
DatabaseModel:统一获取数据库连接;- app/models/Module.php:
ModuleModel通过关联查询hook、module_hook、module三张表,得出"某个钩子点上挂载了哪些已启用的模块"——这是热插拔的数据底座。
app/library/ 目录:可复用的基础类库
- app/library/Module.php:抽象基类
Module,内置install()/uninstall()/enable()/disable()四个生命周期方法,统一维护数据库extensions表,并暴露onInstall()等钩子供子类扩展; - app/library/Hook.php:静态类
Hook::run($key),负责执行某个钩子点上挂载的全部模块。
这两个文件只有几十行,却撑起了整个热插拔体系,值得细读。
app/plugins/ 与 app/services/:钩子插件与业务服务
- app/plugins/Hook.php:
HookPlugin继承 Yaf 插件基类,在框架请求周期的7 个关键时刻(routerStartup、routerShutdown、dispatchLoopStartup、preDispatch、postDispatch、dispatchLoopShutdown、preResponse)自动调用Hook::run(); - app/services/HookService.php:
Services命名空间下的业务服务层,适合放置与模块解耦的可复用业务逻辑。
🔌 app/modules/ 目录:热插拔组件的家(核心重点)
这是 HookPHP 最有特色的目录:一个模块 = 一个完整的"迷你应用",自带控制器、视图和模块主类。以横幅模块为例:
app/modules/HookBanner/ ├── HookBanner.php # 模块主类(继承 Module) ├── controllers/ # 模块自己的控制器(Index / Api) └── views/Index/ # 模块自己的视图📌 以 app/modules/HookBanner/HookBanner.php 为例,它重写了onInstall()(建ip_logs表)和onUninstall()(删表),实现了装模块建数据、卸模块清数据的干净安装体验。旁边的HookMonitor模块同理,是内置的监控组件。
✨ 热插拔全流程只有三步:
- 把模块目录放入
app/modules/→ 配置自动扫描注册; - 调用模块
install()安装 → 写入extensions表并执行onInstall(); - 管理端
enable()/disable()切换状态 → 钩子点即时生效或失效,全程无需改动框架核心代码。
🗂️ runtime/ 目录:缓存与日志的"工作车间"
runtime/是运行期目录,用于存放缓存、日志等临时产物(Yaf 配置中开启了yaf.cache_config=1,配置缓存也会落在这里)。它应该可清空、可重建,并建议配置为 Web 不可访问。
🪝 热插拔架构设计思路:7 个钩子点串联一切
把前面的目录串起来,整条链路一目了然:
请求进入 public/index.php ↓ Bootstrap 启动 → 注册 HookPlugin ↓ 请求周期 7 个关键时刻触发 Hook::run('钩子点') ↓ ModuleModel 查表:该钩子点挂载了哪些 status=1 的模块? ↓ 按 position 顺序依次执行各模块方法 ↓ 汇总输出,继续下一环节- 钩子点定义在框架核心(app/plugins/Hook.php);
- 模块与钩子点的绑定关系存在数据库里(初始化脚本见 hookphp.sql);
- 所以"插件"的增删改,本质是改数据 + 放目录,框架本体纹丝不动——这正是热插拔架构的精髓。
🧩 快速回顾:5 点记忆表
| # | 目录 | 一句话职责 |
|---|---|---|
| 1 | public/ | 唯一入口,对外窗口 |
| 2 | config/ | 模块自动扫描 + 双库配置 |
| 3 | app/Bootstrap.php | 5 步启动总调度 |
| 4 | app/modules/ | 热插拔模块的家 ⭐ |
| 5 | app/plugins/ | 7 个钩子点的"接线板" |
看懂这 9 大目录,你就掌握了 HookPHP 的骨架:核心保持稳定,业务全部插件化。下一步不妨照着HookBanner的结构新建一个自己的模块目录,体验一次"放入即注册"的热插拔流程,你会彻底理解这套架构的设计巧思!
【免费下载链接】HookPHPHookPHP基于C扩展搭建内置AI编程的架构系统-支持微服务部署|热插拔业务组件-集成业务模型|权限模型|UI组件库|多模板|多平台|多域名|多终端|多语言-含常驻内存|前后分离|API平台|LUA QQ群:679116380项目地址: https://gitcode.com/gh_mirrors/ho/HookPHP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考