ThinkPHP 5.1+ 已彻底移除模块化结构,必须改用多应用模式替代;原 Home/Admin 目录需重命名为 app/home/、app/admin/ 并各自包含完整结构,通过 define('APP_MULTI', true) 启用,路由、配置、中间件等均须按应用隔离。

ThinkPHP 5.1+ 已彻底移除「模块化(Module-based)」结构支持,所谓“废弃的模块化”通常指 TP3.x/TP5.0 中通过 APP_MODULE_PATH 或多级目录(如 Application/Home/Controller/)组织的模块划分方式。直接沿用会导致路由失效、控制器找不到、App::module() 报错等现象——这不是配置问题,是架构层级已被删除。
为什么不能简单把 Home/、Admin/ 目录挪进 app/ 下就完事?
TP5.1+ 的 app 目录默认只对应一个应用实例,不再识别子目录为独立模块;MODULE_NAME 常量、GROUP_* 配置、build.php 中的模块生成逻辑全部失效。强行保留目录结构会导致:
-
Route::rule('admin/:id','admin/index/read')匹配到的控制器类名可能是app\controller\AdminIndex,而非预期的app\admin\controller\Index -
Loader::addNamespace('Home', APP_PATH . 'home/')手动注册命名空间后,路由和中间件仍无法自动绑定该“模块”的中间件或配置 - 使用
think\App的run()方法时,$app->module('admin')会抛出InvalidArgumentException: Module not exists
正确迁移路径:用多应用模式替代旧模块化
TP5.1+ 官方推荐且唯一健壮的替代方案是启用「多应用模式」,即每个业务域(原 Home/Admin/API)作为独立 app 目录存在,共享公共 thinkphp 和 public 层。关键操作如下:
- 在
public/index.php中开启多应用:define('APP_MULTI', true)(TP6 起改用APP_NAMESPACE+ 应用目录约定) - 将原
Application/Home/重命名为app/home/,Application/Admin/→app/admin/,确保每个子目录含完整的controller/、model/、config/和route.php - 每个子应用的入口需显式加载:例如
public/admin.php内容为define('BIND_APP', 'admin'); require __DIR__ . '/index.php'; - 路由必须定义在各子应用自己的
app/{name}/route.php中,全局route/app.php不再生效
常见陷阱与绕过技巧
多应用不是“复制粘贴就能跑”,以下几点极易踩坑:
立即学习“PHP免费学习笔记(深入)”;
- 数据库配置若写在
app/common/config/database.php,会被所有应用继承;但若误放在app/home/config/database.php,则admin应用启动时因找不到配置而报Database config not found - 中间件注册位置变了:原来在
Application/Common/Conf/config.php里的'middleware' => [...]必须拆到各app/{name}/config/middleware.php,且类名需按新命名空间(如app\home\middleware\CheckAuth) - TP6 中取消了
APP_MULTI,改用APP_NAMESPACE = 'app'并依赖目录自动识别;若仍用 TP5.1 的多应用写法,在 TP6 下会静默退化为单应用,app/admin/根本不被扫描 - 命令行调用某应用需加
--app=home参数,否则php think make:controller Test默认生成在主应用(app/)下
重构本质不是目录搬家,而是接受“每个业务域是一个独立生命周期”的设计前提。最易被忽略的是配置隔离粒度——连 cache.driver 都可能需要 per-app 设置,否则 admin 后台缓存击穿可能拖垮 home 前台。别省那几行 if (APP_NAME === 'admin') 的判断,该分就得真分。



















