tp8已彻底移除多应用模式,app_multi和domain_bind等配置无效;所有子目录如app/admin均被忽略,请求均由默认应用接管,所谓“子应用运行”实为模块路由fallback假象。

TP8 根本没有多应用模式,别再找 app_multi 配置了
ThinkPHP 8 官方已彻底移除多应用(multi-app)架构,think-multi-app 扩展不再兼容,所有基于 app_multi => true 或 domain_bind 的配置在 TP8 中均无效。这不是“子应用绑定失败”,而是你试图在一个不支持该特性的版本里强行启用它——框架压根不会进入多应用识别流程。
常见现象:App::bind() 在主应用目录下看似有效,是因为它被当作单应用的普通绑定;但一旦你手动创建 app/admin 目录并期望它作为独立应用运行,TP8 会直接忽略该目录,所有请求仍由默认应用(app/index)接管,App::getInstance() 返回的也始终是主应用实例。
验证方式:在 app/admin/controller/Index.php 中打印 get_class(App::getInstance()),结果一定是 think\App,而非某个“admin 应用实例”——因为根本不存在。
App::bind() 在子目录里调用无效的真正原因
TP8 的容器(Container)是全局单例,且生命周期与应用上下文解耦。你在 app/admin/bootstrap.php 或 public/admin.php 里调用 App::bind(),实际操作的是同一个容器实例,但框架不会自动将该绑定作用域限定到“admin”命名空间或路径前缀下。
更关键的是:TP8 不会为子目录自动加载其专属的 provider.php、middleware.php 或 route.php。所有绑定行为若未在主应用的 app/provider.php 中声明,或未通过 Container::getInstance()->bind() 显式注册,就会被后续请求覆盖或根本未生效。
无序列表说明典型误操作:
- 在
app/admin/provider.php里写App::bind('admin_service', ...)—— TP8 不会自动加载这个文件 - 在
public/admin.php入口里调用App::bind()后直接run()—— 绑定发生在运行时,但路由和中间件初始化早已完成,绑定晚了 - 以为
define('APP_NAME', 'admin')能触发应用隔离 —— TP8 已废弃该机制,APP_NAME不再影响容器行为
想让不同入口有独立服务绑定?用多入口 + 显式容器操作
TP8 支持多入口(如 public/admin.php、public/api.php),但每个入口仍是同一套容器,需手动控制绑定时机和范围。核心原则:绑定必须在容器首次被使用前完成,且不能依赖“应用自动识别”。
可行做法:
- 在
public/admin.php开头立即调用Container::getInstance()->bind('user_service', \app\admin\service\UserService::class) - 确保该入口文件中不提前调用任何依赖该服务的 Facade 或
App::make() - 所有子入口共用的绑定(如数据库连接)统一放在
app/provider.php;差异化绑定必须在各自入口文件中显式执行 - 避免在
common.php或全局配置中做绑定——那里没有确定的入口上下文,容易被覆盖
注意:App::getInstance()->bind() 和 Container::getInstance()->bind() 在 TP8 中等价,但前者语义误导性强,建议统一用后者。
为什么你看到的“子应用能跑起来”其实是假象
很多开发者以为 app/admin 目录存在、public/admin.php 可访问、控制器也能响应,就代表多应用成功。其实这只是 TP8 的“模块路由 fallback”在起作用:当找不到 app/admin/controller 对应的类时,框架会退回到 app/index/controller 查找,或者把 /admin/xxx 当作 index 应用下的模块路径处理。
典型破绽:
- 在
app/admin/config/database.php里改了数据库配置,但实际连接的仍是app/index/config/database.php的配置 -
Db::name('user')查询的是主应用的表前缀,不是 admin 应用预设的 - Session、Cache、Log 等中间件配置全部继承自主应用,无法按入口隔离
这些都不是“绑定没生效”,而是整个子应用上下文根本未建立。TP8 的设计哲学是:用多模块(app/index/module/admin)替代多应用,用多入口 + 路由分组 + 配置隔离来模拟行为,而不是重建一套应用级隔离机制。











