删 vendor/ 后必须先运行 composer install 恢复依赖并生成 autoload.php,再执行 dump-autoload;仅 dump-autoload 会因文件缺失而报错。

清理 vendor/ 后必须重跑 install,不能只 dump-autoload
删掉 vendor/ 目录后,vendor/autoload.php 就没了,此时执行 composer dump-autoload 会报错:Warning: require(vendor/autoload.php): failed to open stream。这不是命令用错了,是前提条件不满足。
正确路径只有一条:先恢复依赖,再重建映射。
- 运行
composer install(或composer install --no-dev --optimize-autoloader生产环境)—— 它会重新下载包、生成vendor/autoload.php,并自动触发dump-autoload - 如果
composer.lock已损坏或想彻底重算依赖树,先删composer.lock,再跑composer install --no-cache - 不要手动
require 'vendor/autoload.php'或在钩子里重复加载 ——post-autoload-dump钩子已处于 autoload 加载完成态,再 require 会破坏命名空间绑定
删了 vendor/ 但没动 composer.lock,install 仍可能复用旧缓存
你以为删了 vendor/ 就干净了?不是。Composer 默认还会从 ~/.composer/cache/files/ 解压旧 zip 包,尤其当网络慢或镜像失效时,你看到的 “Installing xxx” 实际只是在解上周的缓存包。
必须同步切断三个来源:
- 删
~/.composer/cache/files/对应包的 ZIP(或直接composer clear-cache) - 确认
composer.lock是最新且未被手动修改(校验哈希是否匹配composer.json) - 加
--no-cache强制走网络:如composer install --no-cache --force-checksums
重建 autoload 后 Class not found?重点查这三处
类文件明明在 src/ 下,composer install 也成功了,但 new 时还是报错。常见原因不是路径写错,而是映射没生效或缓存卡住。
-
composer.json中"psr-4": {"App\": "src/"}末尾必须带斜杠;写成"src"会导致扫描失败 - 开了
"optimize-autoloader": true但没加-o参数,或用了dump-autoload -o却没配"classmap"—— 此时 classmap 文件根本不会生成 - OPcache 没清:PHP 还在用旧 opcode 缓存里的类路径,部署后务必执行
opcache_reset()或重启 PHP-FPM
post-autoload-dump 钩子里能做什么、不能做什么
这个钩子在 autoload.php 写完后立即执行,适合做轻量收尾动作,但极易踩坑。
- ✅ 可安全调用:
unlink()临时 stub、file_put_contents()写新配置、触发 Laravel 的OptimizeCommand - ✅ 可读取
config/*和.env(只要框架已加载它们) - ❌ 禁止
require 'vendor/autoload.php'—— 会引发命名空间污染和 autoloader 重注册 - ❌ 禁止
exec('composer dump-autoload')—— 递归触发死循环 - ❌ 避免远程请求、大文件压缩等耗时操作 —— 它阻塞整个
install/update流程


















