ThinkPHP 8 彻底移除多应用模式,app/目录仅作单应用源码根目录;原TP6的app/admin等结构失效,须改为模块化+路由分组实现逻辑隔离。

ThinkPHP 8 已彻底移除多应用模式,think-multi-app 扩展在 TP8 下完全失效,强行沿用 TP6 的目录结构会导致 Class 'think\App' not found 或路由初始化失败——这不是配置漏了,是底层架构已不支持。
TP8 中「多应用」根本不存在,别再建 app/admin 这类目录
TP8 的 app/ 目录语义已变:它只代表「单应用的源码根目录」,不再允许子目录作为独立应用。如果你还保留 app/admin、app/api 这类结构:
- 框架会忽略它们,既不加载其路由,也不读取其
config/app.php -
app/admin/controller/Index.php不会被自动注册为控制器,访问/admin/index必然 404 - 即使手动 require,也会因容器隔离和 PSR-4 命名空间冲突报
ReflectionException
TP8 的替代路径是「模块化 + 多入口 + 路由分组」,不是目录套目录。
TP6 多应用目录迁移到 TP8 的实操转换步骤
假设你原有 TP6 的 app/admin 和 app/home 两个应用,升级 TP8 时需做以下转换:
立即学习“PHP免费学习笔记(深入)”;
- 把
app/admin/controller/全部移入app/controller/admin/,类命名空间从app\admin\controller改为app\controller\admin - 把
app/admin/model/移入app/model/admin/,命名空间同步改为app\model\admin - 删除所有
app/admin/config/、app/admin/route.php等应用级配置,改用全局config/+ 条件加载(如根据请求路径切换数据库配置) - 原
public/admin.php入口文件必须删掉;所有请求统一走public/index.php,通过路由分组绑定中间件实现逻辑隔离 - 在
route/app.php中用分组定义:Route::group('admin', function () { Route::rule('index', 'admin/index/index'); })->middleware(AdminAuth::class);
TP8 中模拟多应用行为的关键配置点
真正起作用的不是目录,而是路由分组 + 中间件 + 配置动态切换:
-
config/app.php中必须删除'app_multi' => true,该配置在 TP8 中无意义,留着反而干扰加载逻辑 - 每个“逻辑应用”对应的数据库、缓存等配置,应放在
config/database.php中按环境或请求特征判断,例如:if (request()->pathinfo() === 'admin') { return ['type' => 'mysql', 'database' => 'admin_db']; } - 视图模板路径可动态设置:
View::config(['view_path' => app()->getAppPath() . 'view/admin/']);,但不要依赖app/admin/view这种旧结构 - TP8 不再扫描
app/*/route.php,所有路由必须显式写在route/app.php或通过Route::import()加载
最易被忽略的一点:TP8 的 PSR-4 自动加载严格依赖命名空间与路径一致,app/controller/admin/Index.php 的命名空间必须是 app\controller\admin,少一个 \admin 或大小写错(如 Admin),就会直接报 Class not found——这和 TP6 的容错机制完全不同。



















