thinkphp 6 不支持 tp5 风格的多模块目录自动识别,必须安装 think-multi-app 扩展、删除 app/controller、启用 auto_multi_app,并通过 php think build admin 生成标准应用结构,否则 app/admin 目录无效。

ThinkPHP 6 默认不支持传统 TP5 风格的“多模块”,直接在 app/ 下建 admin、api 目录是无效的——框架压根不会扫描这些目录,访问必然 404 或跳回默认模块。
为什么 app/admin 目录存在却无法访问
TP6 的模块识别机制和 TP5 完全不同:它不靠目录名自动映射,而是依赖 topthink/think-multi-app 扩展 + 显式应用结构。如果你只是手动创建了 app/admin,但没装扩展、没删 app/controller、也没启用 auto_multi_app,那这个目录就是个普通文件夹,框架启动时根本不会加载其中的控制器。
-
app/controller必须被删除(或重命名),否则框架判定为单应用模式,直接忽略所有子目录 - 未安装
topthink/think-multi-app时,app/admin下的类不会被自动注册到 Composer autoloader - 即使目录结构正确,若
config/app.php中'auto_multi_app' => false(默认值),URL 中的/admin/...会被当作路径前缀,而非应用切换信号
如何用 php think build 创建真正可用的应用
必须通过命令行工具生成标准应用结构,不能手建目录。每个应用需含完整 MVC 子目录,且命名空间与目录严格对应。
- 执行
php think build admin后,会生成app/admin/controller、app/admin/model、app/admin/view等标准结构 - 控制器类必须声明为
namespace app\admin\controller;,不能写成app\controller或漏掉admin段 - 入口 URL 格式为
/index.php/admin/index/index(开启url_common)或/admin/index/index(关闭后需伪静态支持) - 若使用域名绑定(如
admin.example.com),需在config/route.php中用Route::domain()显式绑定,并调用Route::bind('admin')
模块间共享模型但隔离配置的实操方式
共用用户表但后台要额外字段校验、前台要短信登录?硬复制模型或写死配置都会导致维护断裂。
- 通用模型统一放
app/common/model/User.php,命名空间为app\common\model\User - 后台专属逻辑写在
app/admin/model/AdminUser.php,继承自app\common\model\User,只覆盖验证规则、搜索条件等差异点 - 模块级数据库配置放在
app/admin/config/database.php,内容只需返回差异项(如'hostname' => '127.0.0.1'),框架会自动合并全局配置 - 切忌在控制器里用
Db::connect('admin_db')硬编码连接名——应通过模型的protected $connection属性指定
路由 404 却提示“找不到控制器”时优先检查什么
这不是代码写错了,而是请求根本没进到目标应用上下文,框架仍在默认应用里找控制器。
- 确认
runtime/app.php缓存是否过期——改完config/app.php后必须清空runtime/目录 - 检查
public/.htaccess(Apache)或 Nginx 的try_files规则,确保 PATH_INFO 能正确截取第一段作为应用名 - 用
php think route:list查看实际注册的路由,若输出中没有admin/开头的路由,说明应用未被识别 - 临时在
app/admin/controller/IndexController.php的index方法开头加dump(app()->getAppNamespace()); die;,确认当前运行时 namespace 是否为app\admin
最易被忽略的是 app/controller 目录残留和 runtime 缓存未清——这两点占了线上环境 70% 以上的“模块存在却不可访问”问题。别跳过,删干净再试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











