ThinkPHP 6 模块目录名必须全小写,如 app/admin;命名空间为 app\user\controller;控制器类名与文件名须严格一致(PascalCase);多应用模式下模块概念消失;修改后需执行 composer dump-autoload -o 刷新自动加载。

ThinkPHP 6 的模块名必须全小写
在 ThinkPHP 6 中,app 目录下的模块目录名(如 app/admin、app/api)会被自动映射为路由和命名空间前缀。但框架底层用 strtolower() 强制转换模块名,所以哪怕你建了 app/Admin 或 app/API,框架也只认 admin 和 api 这种全小写路径。一旦目录名含大写字母,Controller 类加载时就会因命名空间不匹配而报 Controller class not found。
- 模块目录名必须是纯小写,例如
app/user,不能是app/User或app/UserModule - 对应命名空间也必须严格匹配:模块
user→ 命名空间app\user\controller,不是app\User\controller - Windows 下可能“看似能运行”,是因为文件系统不区分大小写;但部署到 Linux 服务器必然失败
控制器类名与文件名必须完全一致(含大小写)
ThinkPHP 6 默认启用 PSR-4 自动加载,要求类名和文件名严格一致。比如 UserController 类必须放在 app/user/controller/UserController.php,而不是 usercontroller.php 或 user_controller.php。大小写错一个字母,class not found 就立刻出现。
- 文件名必须首字母大写 + PascalCase,如
IndexController.php、ArticleListController.php - 类名必须与文件名完全相同,包括大小写:
class ArticleListController extends Controller - Linux 服务器上,
indexcontroller.php和IndexController.php是两个不同文件,前者不会被加载
路由绑定或多应用模式下,模块名需显式声明
开启多应用(app/multi_app = true)或手动绑定路由时,模块名不再从 URL 路径自动推导,而是依赖配置或 route::rule() 中的 module 参数。如果这里写的模块名和实际目录名不一致(比如写成 'module' => 'Admin'),也会触发类找不到。
- 检查
config/route.php中是否用了大写模块名,例如'module' => 'Admin'→ 应改为'module' => 'admin' - 使用
Route::get('admin/index', 'admin.Index/index')时,第一个admin是模块名,必须小写 - 多应用模式下,
app目录下每个子目录就是独立应用,此时“模块”概念已不存在,别再混用模块路由写法
composer autoload 没刷新导致类缓存失效
改完目录结构或类名后,如果没执行 composer dump-autoload,Composer 的类映射仍指向旧路径,Controller class not found 就会持续出现——尤其当你把 app/admin 改成 app/api 后忘了刷新 autoload。
- 每次调整模块目录、控制器文件名或命名空间后,必须运行
composer dump-autoload -o - 开发中可加
--no-cache避免 Composer 缓存干扰:composer dump-autoload --no-cache - 注意
composer.json中的"psr-4"映射是否还包含已删除的模块路径,残留项会导致加载冲突
最常被忽略的是:你以为改对了文件名和目录,其实只是 Windows 文件管理器没显示扩展名,或者终端里用 ls 看不到隐藏的大小写差异。真要确认,得用 ls -la app/user/controller/ 看真实文件名,而不是靠眼睛猜。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










