class not found 错误根本原因是 psr-4 自动加载未匹配,而非文件丢失;需确保模型文件名与类名一致、namespace 为 appmodels(首字母大写)、use 语句完整正确,并执行 composer dump-autoload 刷新映射。

Class not found 错误根本不是文件丢了
绝大多数“Class not found”报错,实际是 PSR-4 自动加载机制没对上——不是类不存在,而是 PHP 根本没去你认为的那个路径找。Laravel 迁移文件本身不参与自动加载(它只是被 php artisan migrate 逐个 require),但如果你在迁移里引用了模型(比如 MenuList::truncate()),那这个模型就必须能被 Composer 正确加载。
检查 app/Models/ 下每个模型的 namespace 声明
打开 app/Models/MenuList.php,确认顶部只有且仅有这一行命名空间声明:
<?php namespace AppModels;
常见错误包括:
-
namespace App;→ 仍指向app/根目录,找不到app/Models/下的类 -
namespace appModels;→ 首字母小写,PSR-4 要求命名空间首字母大写 -
namespace Appmodeles;→ 目录名是Models(带大写 M),拼写必须完全一致
所有 use 语句必须带 Models 子命名空间
在迁移文件、控制器、命令或测试中引用模型时,use 必须显式写出完整路径:
use AppModelsMenuList;
不能写成:
-
use AppMenuList;→ Laravel 7+ 已弃用该路径 -
use MenuList;→ 没有命名空间前缀,PHP 在当前作用域找,必然失败 -
use appModelsMenuList;→ 小写app不合法
批量检查残留旧引用可执行:
grep -r "use App\" app/ --include="*.php" | grep -v "Models\"
改完必须运行 composer dump-autoload
即使文件名、命名空间、use 全对,Composer 的类映射缓存没更新,PHP 依然加载失败。每次修改模型路径或命名空间后,必须执行:
composer dump-autoload
如果使用 Sail 或 Docker:
- 进容器执行,不要在宿主机跑
- 若启用了 OPCache(如 Nginx + PHP-FPM),还需
sudo service php8.3-fpm reload或重启容器 -
php artisan config:clear或cache:clear对此问题无效
真正容易被忽略的是:迁移文件里调用模型时,错误往往藏在「以为只改了控制器,忘了迁移也依赖它」——只要迁移里出现 AppModelsXxx,它就得和所有其他地方一样,经受命名空间、路径、autoloader 三重校验。











