Class not found 错误本质是 PSR-4 自动加载失败,需严格匹配文件路径(如 app/controller/Index.php)、文件名(Index.php,首字母大写 PascalCase)、命名空间(namespace app\controller;),并执行 composer dump-autoload -o 刷新映射。

Class not found 错误本质是 PSR-4 加载失败
ThinkPHP 6+ 不自己“找”控制器,它完全依赖 Composer 的 PSR-4 自动加载机制。报 Controller class not found,根本不是框架路由问题,而是 PHP 类加载器根本没注册到这个类——composer dump-autoload -o 没跑、路径不对、命名空间写错、大小写差一个字母,都会直接触发这个错误。
常见现象包括:
- 本地 Windows 能访问,Linux 部署后 404 或 Class not found
- URL 访问
/index/index,日志却提示Class "appcontrollerIndex"(中间缺反斜杠) - 改过文件名或目录后,清了 Runtime 也没用
必须按顺序检查这三项:文件路径 → 文件名 → 命名空间,缺一不可。
控制器文件路径和文件名必须严格匹配
ThinkPHP 6 默认只认 app/controller/ 目录下的控制器(注意是小写 controller,不是 Controller 或 controllers)。任何偏差都会让 PSR-4 映射失效。
立即学习“PHP免费学习笔记(深入)”;
文件名规则非常死板:
- 必须首字母大写 + PascalCase,如
Index.php、UserProfile.php,不能是index.php、user_profile.php、UserController.php - 类名必须与文件名**完全一致**,包括大小写:
class UserProfile必须对应app/controller/UserProfile.php - 模块控制器(如 admin)要放在
app/admin/controller/,且模块目录名必须全小写:app/Admin是无效的
Windows 下可能“侥幸通过”,但 Linux 服务器上 UserProfile.php 和 userprofile.php 是两个不同文件,后者不会被加载。
命名空间声明不能漏字、不能错大小写
控制器文件顶部的 namespace 必须和实际路径严丝合缝。例如:
-
app/controller/Index.php→ 必须写namespace app\controller; -
app/api/controller/Order.php→ 必须写namespace app\api\controller;
常见错误:
- 漏掉
app\,写成namespace controller;→ 加载时变成controller\Index,找不到 - 大小写错:
namespace App\controller;(A 大写)→ PSR-4 不认,因为 vendor/autoload_psr4.php 里注册的是小写app\ - 多应用模式下误写模块名:
namespace app\Admin\controller;→ 应为app\admin\controller;
错误提示往往只显示 “Class not found”,不会告诉你 namespace 哪里错了,所以得手动比对。
改完代码后必须刷新 Composer 自动加载
ThinkPHP 不缓存控制器类,但它完全依赖 Composer 生成的 vendor/composer/autoload_psr4.php。只要改过目录结构、类名、命名空间,就必须执行:
composer dump-autoload -o
否则旧映射还在,新文件永远不生效。尤其在以下场景容易忽略:
- 把
app/admin改成app/api后忘了刷新 - 新增了
app/user/controller目录但没跑命令 - 用 IDE 重命名文件,结果只改了类名没同步改文件名,或反之
顺带提醒:-o 参数必须加,它启用优化模式,否则某些 PSR-4 映射可能不生效。
最常被跳过的检查点是命名空间里的 app\ 前缀是否拼错、模块目录是否全小写、以及 composer dump-autoload -o 是否真执行成功——而不是只敲了命令就以为完事。



















