多应用模式需三者齐备:安装think-multi-app扩展、用命令创建应用目录结构、入口文件定义app_multi_module常量。仅改配置无效,路由须显式导入,命名空间和路径必须严格匹配。

多应用模式不是改个配置就能开,必须 composer require topthink/think-multi-app + 目录重建 + 入口前定义 APP_MULTI_MODULE 三者齐备,缺一不可。
安装扩展并确认服务注册
ThinkPHP 6 默认不带多应用能力,think-multi-app 是独立扩展包,不是可开关的内置功能。只改 config/app.php 里的 'app_multi_module' => true 完全无效。
- 在项目根目录执行:
composer require topthink/think-multi-app - 检查
config/app.php的'providers'数组,确认已包含\think\multi\AppServiceProvider::class;若没有,手动加进去 - 运行
php think version,输出中应含think-multi-app字样,否则扩展未生效
创建应用目录结构不能靠手建
app/ 下每个子应用(如 admin、api)必须由命令生成,否则命名空间、自动加载、路由识别全错。
- 用命令创建:
php think app:create admin(TP6.1+)或php think build admin(旧版) - 验证生成结果:
app/admin/controller/存在且控制器类命名空间为app\admin\controller - 别手动复制
app/index改名——app_namespace不同步会导致Class not found - 新增应用后,必须立刻在
config/app.php中核对'app_namespace' => 'app'(顶层命名空间),不是app\controller
路由必须显式导入,不能依赖路径自动匹配
多应用下,route/route.php 是全局入口,但各应用的路由文件默认不加载,Route::import() 是唯一启用方式。
- 在
config/route.php中添加:Route::import('admin', 'admin');—— 第二个参数必须和app/下目录名完全一致(大小写敏感) -
app/admin/route/app.php文件必须存在,且以use think\facade\Route;开头 - 不要在
app/admin/route/app.php里再套Route::group('admin', [...]),否则 URL 变成/admin/admin/xxx - 调试时可在
app/admin/route/app.php首行加exit('loaded');,访问/admin/看是否触发,快速判断路由文件是否被加载
切换单/多应用模式必须改入口文件
配置项 'app_multi_module' => false 写在 config/app.php 里毫无作用。真正起效的是入口文件中 define('APP_MULTI_MODULE', false) 这一行。
- 切回单应用:打开
public/index.php,在require __DIR__ . '/../vendor/autoload.php';前插入:define('APP_MULTI_MODULE', false); - 同时必须清空
app/下所有子目录(如admin、api),把控制器全挪回app/controller - 删掉所有
Route::import()调用,否则路由仍按多应用逻辑解析,结果是 404 或跳错控制器 - URL 生成行为会变:
url('index')在多应用下输出/admin/index,单应用下是/index,模板里硬编码的链接可能失效
最常被忽略的是:扩展装了、目录建了、配置也改了,但没在入口文件定义 APP_MULTI_MODULE,或者 Route::import() 拼错了第二个参数——这两个点不卡死,其他都白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











