tp8已彻底移除多应用模式,必须删除app/multi.php、设'app_multi'=>true、用app::factory()、子应用目录需含controller/和route/app.php且命名空间严格匹配目录结构。

TP6 升级到 TP8 后,自定义应用命名空间不能沿用 TP6 的 multi-app 扩展写法,必须改用 TP8 原生的多应用目录结构 + app_multi 配置双驱动,否则应用识别失败、路由 404、类自动加载静默跳过。
TP8 多应用命名空间由目录结构决定,不靠配置文件或扩展注册
TP8 彻底移除了 topthink/think-multi-app 扩展的兼容支持。即使你保留了 composer require topthink/think-multi-app,它也不会生效——TP8 的 PSR-4 自动加载器只认实际目录路径。
- 子应用必须放在
app/下同级目录,例如app/admin、app/api,不能是app/admin/controller这种嵌套在单应用目录里的伪结构 - 每个子应用的根命名空间必须与目录名严格一致:
app/admin→namespace app\admin;;app/api→namespace app\api; - 控制器类文件名必须与类名完全一致(大小写敏感):
app/admin/controller/Index.php内必须是class Index,不能是class index或class IndexController - 入口路由文件必须命名为
route/app.php(不是route.php),且只对当前子应用生效
必须显式开启 app_multi 并删除旧版 multi.php
TP6 的 app/multi.php 在 TP8 中已完全废弃。如果该文件还存在,TP8 会误判为单应用模式,导致所有子应用路由无法匹配,请求全部落入默认应用(通常是 app/index)。
- 删除
app/multi.php(哪怕它是空文件) - 在
config/app.php中设置:'app_multi' => true - 确认
APP_NAMESPACE环境变量未被覆盖(如 .env 中不要写APP_NAMESPACE=app,TP8 会自动推导) - 检查
public/index.php入口是否仍调用App::create()而非App::factory()—— TP8 多应用必须用App::factory()
子应用内控制器和模型的命名空间不能省略,且不能复用 TP6 的 use think\Controller
TP8 不再支持短命名空间别名,所有框架类引用必须走完整命名空间,且控制器基类也变了。
- 控制器必须以
namespace app\admin\controller;开头,继承think\controller\Base(不是think\Controller) - 模型必须以
namespace app\admin\model;开头,继承think\Model(不是think\Model as BaseModel) -
use think\facade\Db仍可用,但use think\Model必须删掉或改为use think\Model as Model;,否则类名冲突 - 中间件类必须实现
think\contract\MiddlewareInterface,且handle()方法必须声明返回类型:public function handle(Request $request, \Closure $next): Response
常见错误:访问 /admin 返回 404 或 “Class not found”
这不是路由没写对,而是 TP8 根本没识别出 admin 是一个应用。本质是命名空间链断裂。
- 检查
app/admin/controller/Index.php第一行是否为namespace app\admin\controller;(注意结尾分号) - 运行
php think route:list,看输出里有没有admin前缀的路由 —— 没有就说明应用未加载 - Linux 下用
ls -l app/admin/controller/确认文件名是Index.php,不是index.php或IndexController.php - 别在
app/admin/route.php里写Route::get('index', 'index/index'),必须用完整类名:Route::get('index', [\app\admin\controller\Index::class, 'index'])
最易忽略的一点:TP8 的多应用识别依赖于 app/ 目录下是否存在同名子目录,且该子目录内必须有 controller/ 和 route/app.php。少任何一个,它就当普通文件夹处理,命名空间自然不成立。











