Files

3.3 KiB
Raw Permalink Blame History

目录结构

YwxApp 采用 ThinkPHP 多应用模式,目录职责划分清晰。

顶层目录

ywxapp_dev/
├── app/            应用目录(多应用模式)
├── addon/         插件目录,每个子目录是一个独立插件
├── config/         全局配置
├── docs/           开发文档(本文档站的数据源)
├── extend/         扩展类库(PSR-0
├── public/         Web 根目录,入口文件与静态资源
├── route/          全局路由定义
├── runtime/        运行时缓存、日志、临时文件
├── templates/      模板皮肤包
├── vendor/         Composer 依赖
└── ywxapp/         框架核心库(PSR-4 命名空间 ywxapp\

app 应用目录

app/
├── api/            对外 API 接口应用
├── backend/        后台管理应用
├── member/         会员中心应用
├── frontend/       前台应用
├── site/           展示官网 / 文档站应用
├── common.php      全局公共函数
├── event.php       全局事件定义与监听器注册
├── middleware.php  全局中间件
├── provider.php    容器绑定
└── service.php     服务注册(含 AppService

注意:多应用模式下 base_path() 返回的是 app/ 目录而非项目根目录。 若需要扫描 addon/app/ 等顶层目录,必须使用 root_path()

addon 插件目录

单个插件的标准结构:

addon/<插件名>/
├── info.php            插件清单:name/title/intro/version/state
├── Addon.php           插件主类,继承 ywxapp\addon
├── config.php          插件配置项定义
├── menu.json           后台菜单定义
├── install.sql         安装 SQL
├── controller/
│   ├── backend/        后台控制器(继承 AddonBackend
│   ├── api/            接口控制器
│   └── frontend/       前台控制器
├── model/              数据模型
├── service/            业务服务
├── subscribe/          事件订阅器(钩子实现)
├── route/app.php       插件路由(写相对组名,框架自动补前缀)
├── view/               视图模板
└── docs/               插件文档

ywxapp 核心库

ywxapp/
├── command/            自定义命令行工具
├── controller/         控制器基类(Frontend / Backend / AddonBackend / Api
├── library/            工具类库(SchemaGuard / SkinOverlay / Markdown 等)
├── middleware/         框架中间件(MultiApp / AddonPerformance 等)
├── service/            核心服务(AppService / AddonService
├── addon.php          插件基类
└── helper.php          全局辅助函数

路由约定

由于 MultiApp 中间件会将 URL 首段解析为应用名,因此:

  • 应用级路由文件 app/<app>/route/route.php 不会自动加载
  • 全局路由统一写在 route/app.php,并携带应用名前缀
// route/app.php
Route::get('site/doc', 'site/doc/index');

插件路由则写在 addon/<插件名>/route/app.php,使用相对组名,由 AppService::loadAddonRoutes() 自动包裹 Route::group('<插件名>')