thinkphp目录结构依赖严格路径约定:app模块名须全小写,config仅加载根目录php文件,public为唯一web入口,runtime需分层设权清理,任何路径错位都会导致自动加载、路由或配置失效。

目录结构乱了,不是框架坏了,是约定被绕过了。ThinkPHP 的自动加载、路由解析、配置合并全靠路径触发,改错一个目录名或放错一个文件,php think make:controller 生成的类就找不到,Config::get('database') 返回空,app/admin 模块访问时直接抛 ClassNotFoundException。
app 目录下的模块名必须全小写
ThinkPHP 6 默认开启多应用模式时,会把 app 下的子目录名强制转成小写作为模块标识。你建了个 Admin 目录,框架实际只认 admin —— 但命令行生成器、命名空间、路由定义仍按你写的原名走,结果就是控制器类存在,却无法被自动加载。
- 立即重命名:把
app/Admin改为app/admin,app/API改为app/api - 检查
config/app.php中的'default_module' => 'index',确保值与真实目录名一致(如设为'admin',则必须有app/admin) - 如果用的是单应用模式(即不用多模块),
app下不应有任何子目录,所有控制器直接放在app/controller,且需确认config/app.php中'app_multi' => false
config 目录只加载根目录下的 PHP 文件
think\facade\Config 默认只合并 config/ 根目录下以 .php 结尾的文件,config/database/mysql.php 这类路径完全不生效,也不会变成 database.mysql 子项。
- 业务配置全部平铺:把
alipay.php、wechat.php、oss.php全放config/下,别建子目录 - 敏感配置(如数据库密码、API密钥)必须写进
.env,而不是 PHP 配置文件 - 自定义配置文件(如
config/custom.php)需手动调用Config::load('custom', 'custom'),否则不会进入配置池
public 是唯一合法的 Web 入口目录
ThinkPHP 6 不再支持把 index.php 放在项目根目录。旧项目直接迁移,Web 服务器根本没走到框架,404 不是路由问题,是请求压根没进 public/index.php。
- Apache:修改
DocumentRoot指向/path/to/project/public,不是项目根目录 - Nginx:
root必须设为/path/to/project/public,且location /块中保留try_files $uri $uri/ /index.php?$query_string; - PHP 内置服务器:必须在
public目录下执行php -S localhost:8000 router.php,不能在项目根目录运行
runtime 权限和清理要分层处理
runtime 是缓存、日志、模板编译的统一出口,但它不是“整个目录给 777 就完事”。子目录权限不继承、清理策略不区分,会导致日志能写但模板缓存失败,或者高并发下删了 runtime/view 引发 CPU 尖峰。
- 部署时执行
chmod -R 775 runtime/(Linux),Windows 下确保 IIS/Apache 用户对整个runtime有完全控制权 - 可定期清理:
runtime/log和runtime/cache,它们不参与运行时关键逻辑 - 慎删:
runtime/view删了会强制重编译模板,上线后务必关闭调试模式(APP_DEBUG = false),否则runtime/trace会持续膨胀
真正卡住人的,从来不是“该放哪”,而是“为什么放这”。ThinkPHP 的目录不是文件夹集合,是一套触发链:入口路径 → 模块名解析 → 命名空间映射 → 配置加载 → 类自动注册。任何一个环节断开,错误表现都像随机故障,但根源永远在路径约定被悄悄绕过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











