thinkphp官方骨架初始化是唯一可靠方式,手动建目录90%引发路由失效、模型找不到等问题;app目录须全小写,多应用模式下模块名强制转小写,配置文件仅根目录有效,.env敏感配置需配合runtime缓存清理生效。

直接用 ThinkPHP 官方骨架初始化,别自己从零手建目录——手动拼凑的结构 90% 会触发路由失效、模型找不到、配置不加载等隐性问题。
app 目录必须全小写,且不能嵌套非模块目录
ThinkPHP 6 默认启用多应用模式时,app 下每个子目录名就是模块名,框架内部会强制转成小写做标识。比如你建了 app/Admin,实际注册的模块是 admin,但 php think make:controller Admin/Index 生成的类命名空间仍是 app\Admin\controller\Index,访问 /admin/index/index 就会抛 ClassNotFoundException。
- 所有模块目录名必须全小写:
app/admin、app/api、app/merchant -
app/common是合法的,但它是“公共模块”,不是放工具类的垃圾桶;工具类建议放app/service或独立命名空间 + Composer autoload 映射 - 禁用多应用(单应用)时,
app下不应有子目录,控制器直接放app/controller,否则app/index/controller这类路径会被误判为模块
config 目录只自动加载根目录下的 PHP 文件
config/database.php 能通过 Config::get('database') 读到,但 config/database/mysql.php 完全不会被识别,也不会合并进 database 配置分组。框架不递归扫描子目录。
- 业务配置平铺在
config/根目录:config/alipay.php、config/wechat.php - 敏感配置(如数据库密码)必须写在
.env,PHP 配置文件里只用env('DB_PASSWORD') - 改了
.env后没生效?清掉runtime/config/缓存目录再试 - 自定义配置文件(如
config/custom.php)需手动调用Config::load('custom'),不能依赖自动加载
public 是唯一合法 Web 入口,其他目录禁止 HTTP 可达
Web 服务器(Nginx/Apache)必须把网站根目录设为 public/,而不是项目根目录。设错会导致 config/database.php 被直接下载、app/controller 源码暴露、静态资源 404。
- 本地开发用 PHP 内置服务器时,必须加
-t public:php -S localhost:8000 -t public/ router.php -
public/static/存放 CSS/JS/图片,URL 路径就是/static/css/app.css -
public/index.php是唯一入口,它加载框架并执行think\App::run(),删不得、挪不得 - 不要在
application/或app/下放任何可被浏览器直连的 HTML/JS/CSS —— 它们不会被解析,只会原样输出或报 404
runtime 必须可写,且子目录权限要继承
runtime 不只是“能写就行”。runtime/cache、runtime/log、runtime/view 各自用途不同,权限不一致会导致部分功能静默失败:日志能写,但模板缓存写不了,页面反复重编译,CPU 突增。
- 部署时执行
chmod -R 775 runtime/(Linux),确保 Web 进程用户(如www-data、nginx)对整个目录可读写 -
runtime/view删了会强制重编译,高并发下可能引发瞬时 CPU 尖峰,上线后别随便清 - 上线前务必关闭
APP_DEBUG = false,否则runtime/log/会持续写 trace 日志,磁盘撑爆 - Windows 下若挂载 Linux 共享目录,注意 SELinux 或挂载参数是否禁用了写入
真正卡住人的从来不是“怎么建目录”,而是建完之后某天突然发现路由不跳、模型查不到表、配置死活不生效——那八成是某个目录名大小写错了,或者 public 没设对,又或者 .env 改了但 runtime/config/ 还缓着旧值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











