thinkphp 8.0 开启多应用需同时满足四条件:安装 think-multi-app 扩展、在 public/index.php 入口文件中 define('app_multi_module', true)、删除 app/controller 目录、创建应用子目录(如 app/admin);缺一不可,否则出现 404 或路由错乱。

ThinkPHP 8.0 开启多应用不是改一个配置就能跑起来的,必须同时满足:安装扩展、定义常量、清理目录结构、创建应用子目录这四个硬性条件。漏掉任意一项,都会出现 404、App::getModule() 返回空、或路由始终进 index 应用等现象。
必须在入口文件定义 APP_MULTI_MODULE
这个常量只在 public/index.php(或其他入口)中 引入框架前 定义才生效。在 config/app.php 里写 'app_multi_module' => true 完全无效——这是最常踩的坑。
正确做法是:
- 打开
public/index.php - 在
require __DIR__ . '/../vendor/autoload.php';之前插入:define('APP_MULTI_MODULE', true); - 确保没有其他地方(比如中间件或命令行脚本)重复定义该常量
如果后续要切回单应用模式,删掉这行即可;设为 false 也行,但不能靠 config 文件控制。
必须安装 topthink/think-multi-app 扩展
ThinkPHP 8.0 核心不内置多应用逻辑,think-multi-app 是唯一被官方认可的支撑扩展。没装它,框架压根不会识别 app/admin 这类子目录。
执行以下命令安装并确认注册:
composer require topthink/think-multi-app- 检查
config/app.php的providers数组是否已自动加入\think\multi\AppServiceProvider::class;若没有,手动加进去 - 运行
php think app:create admin测试能否成功生成app/admin目录结构(含controller、config、middleware.php等)
注意:php think build admin 是旧版命令,TP8 推荐用 app:create。
必须删除 app/controller 目录
这是单应用残留结构。只要它还存在,框架在多应用模式下仍会尝试加载其中的控制器,导致路由冲突或误匹配(比如访问 /admin/index 却跑进 app/controller/Index.php)。
操作很简单:
-
rm -rf app/controller(Linux/macOS)或手动删除该文件夹 - 确认
app/下只剩子应用目录,如app/index/、app/admin/ - 每个子应用的控制器必须放在对应路径下,例如 admin 应用的控制器是
app/admin/controller/Index.php,命名空间为app\admin\controller
不删干净,Route::rule('hello', 'index/hello') 这类未带应用前缀的路由可能意外命中单应用控制器。
注解路由需手动扩展扫描路径
如果你用了 topthink/think-annotation,默认只扫 app\controller,而多应用下控制器在 app\admin\controller 等命名空间里,自然失效。
解决方法是在 config/annotation.php 中显式添加路径:
'include_paths' => [
APP_PATH . 'index' . DS . 'controller',
APP_PATH . 'admin' . DS . 'controller',
APP_PATH . 'api' . DS . 'controller',
],
或者更稳妥地用通配:
'include_paths' => glob(APP_PATH . '*', GLOB_ONLYDIR),
但要注意:glob 方式会把 app/common 或 app/service 也扫进去,若里面误放了带 #[Route] 的类,可能引发路由冲突。
多应用真正的复杂点不在配置本身,而在于各应用的 runtime 目录、日志路径、静态资源 URL 前缀必须隔离,否则 admin 登录态可能污染 index 的缓存,或者两个应用共用同一份 route_cache.php 导致路由互相覆盖。这些细节不主动处理,上线后问题会延迟暴露。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











