ThinkPHP6目录结构严格遵循PSR-4规范,命名空间路径必须与文件系统路径完全一致。app/存应用逻辑,config/放配置文件,route/定义路由,public/为唯一入口,runtime/需可写,vendor/为依赖目录;模块名、子目录名须小写,类名须驼峰且首字母大写;多应用或模块化可提升复用性;部署时运行目录须指向public,子目录需配置APP_BASE_PATH和app_url,静态资源应使用url()或asset()函数生成链接。

ThinkPHP6 的目录结构不是随便安排的,它直接关系到自动加载是否成功、路由能否识别、调试是否方便,甚至影响上线后的稳定性。核心就一条:命名空间路径必须严格等于文件系统路径,大小写、斜杠、层级都不能错。
标准项目结构与各目录职责
一个规范的 TP6 项目根目录通常包含以下关键部分:
-
app/:应用逻辑主目录,存放控制器、模型、中间件、服务类等。所有类文件需遵循 PSR-4 规则,如
app/controller/UserController.php对应命名空间app\controller\UserController -
config/:配置文件集中地,包括数据库、缓存、日志等。不能放在
public/下,否则有泄露风险 -
route/:路由定义目录,含
app.php(应用级路由)、api.php(API 路由)等,支持分组和中间件绑定 -
public/:Web 唯一可访问入口目录,含
index.php和静态资源(CSS/JS/IMG)。服务器运行目录必须指向此处 - runtime/:运行时生成目录,存放缓存、日志、模板编译文件等,需保证可写权限
- vendor/:Composer 依赖包目录,不应手动修改
app/ 目录内部命名规范
这个目录最容易出错,关键在于“哪些必须小写、哪些必须驼峰”:
- 模块目录名(如
index、admin、api)必须全小写,不支持驼峰或下划线以外的字符,因为它们是路由分组标识 - 子目录名
controller、model、middleware、service必须全小写,框架默认只认这些名称 - 类文件名必须首字母大写+驼峰,且与类名完全一致,例如
UserLoginService.php内必须声明class UserLoginService - 控制器类必须继承
think\Controller,模型类推荐继承think\Model,否则容器注入和查询构造器可能失效
多应用与模块化组织方式
当项目需要区分后台、前台、API、小程序等场景时,不建议简单复制 controller 目录,而应采用多应用或模块化结构:
立即学习“PHP免费学习笔记(深入)”;
- 多应用模式下,在
app/下建多个小写目录(如admin、api),每个目录内保持完整子结构(controller、model等) - 需在入口文件或
config/app.php中配置app_namespace,确保自动加载能准确定位 - 模块化方案更灵活:把通用业务(如新闻、用户、订单)抽成独立模块目录(如
module/news/),再通过路由和中间件按需挂载,删模块时只需删整个目录 - 避免在不同应用里重复写相同逻辑,共用的服务类可统一放在
app/service/或独立app/common/
部署与路径相关注意事项
目录结构定好后,部署阶段常因路径理解偏差导致 404 或资源加载失败:
- 宝塔/Nginx 配置时,网站运行目录必须设为
/public,不是项目根目录 - 若部署在子目录(如
https://site.com/myapp/),需在public/index.php中定义APP_BASE_PATH,并在config/app.php中设置app_url - 静态资源链接不要硬写绝对路径,优先使用
url()或asset()函数,它们会自动补上前缀 -
.env文件要重命名自.example.env,数据库、缓存等敏感配置从此读取,不能提交到 Git



















