类找不到的根本原因是laravel未识别该包,需先执行composer dump-autoload刷新自动加载映射,再检查服务提供者注册、自动发现配置及私有包的repositories、autoload和git标签。

composer require 后类找不到,先别删包重装
根本不是包没装上,而是 Laravel 没“看见”它——vendor/autoload.php 里的类映射表没更新。执行 composer require spatie/laravel-permission 只改了 composer.json 和 composer.lock,不会自动重生成 PSR-4 映射。
立刻运行:composer dump-autoload
- 这是最常被跳过的一步,90% 的
Class not found错误靠它解决 - 如果包用的是
classmap或自定义路径(比如"autoload": {"classmap": ["src/helpers/"]}),这步更不能省 - 确认该包的
composer.json里有合法autoload声明,例如:"psr-4": {"Spatie\Permission\": "src/"}
php artisan package:discover 没输出你的包名?查两个硬性条件
Laravel 5.5+ 的自动发现不是“装完就注册”,它只认同时满足以下两点的包:
-
"type": "laravel-package"必须出现在包自己的composer.json中(不是主项目) -
"extra": {"laravel": {"providers": ["Vendor\Package\ServiceProvider"]}}要完整声明,且providers数组不能为空
运行:php artisan package:discover
观察终端输出是否含你的服务提供者全名(如 SpatiePermissionPermissionServiceProvider)。没出现?说明自动发现流程压根没走到它——不是 Laravel 问题,是包配置缺项。
若你已在主项目 config/app.php 手动加了 providers,但命令仍不生效,先清缓存:php artisan config:clear
本地开发时改代码不生效?别用 composer link
直接 composer require vendor/package 远程包,改一行代码就得 composer update,效率极低。真实开发必须走 path repository。
在 Laravel 项目根目录的 composer.json 里加:
"repositories": [
{
"type": "path",
"url": "../my-laravel-package"
}
]
然后运行:composer require vendor/package:@dev
-
@dev是关键,否则 Composer 可能忽略本地路径,去 Packagist 拉稳定版 - 改完
my-laravel-package/src/里的代码,Laravel 立刻读取 symlink 下的最新文件,无需重装 -
composer link在 Laravel 10+ 和 Windows 上容易因 autoload 冲突失败,path方式更稳
生产环境部署脚本里写 composer update 是高危操作
composer install 和 composer update 行为完全不同,混用会导致线上环境突然崩掉。
-
composer install:只读composer.lock,装里面锁死的版本,保证所有环境依赖完全一致 —— CI/CD 流水线、线上部署第一句必须是它,且加--no-dev -
composer update:无视composer.lock,重新解析composer.json约束(如"^8.0"),可能升到带 BC break 的小版本(比如v3.2.0 → v3.3.0里某个方法签名变了) - 只想升级单个包?用
composer update vendor/package --with-dependencies,比裸update安全得多
私有包装不上?三个点卡住:包自己的 composer.json 缺 "name" 和 autoload;Git 仓库没打 v1.2.0 这类语义化标签;SSH key 没配好导致 git clone 失败——这些都得逐个验证,不能只盯着主项目报错。











