post-autoload-dump 钩子仅在 composer dump-autoload、install、update 实际生成或更新 autoload_files.php/autoloader_classmap.php 后触发,非每次 require 都执行;需正确注册于 scripts 段,键名为 "post-autoload-dump",值支持命令数组或 "Class::method" 格式;执行时 vendor/autoload.php 已存在但自定义类未必可加载,脚本路径以 composer.json 目录为基准。

post-autoload-dump 钩子到底在什么时候触发
它只在 composer dump-autoload、composer install、composer update 这三个命令真正**生成或更新了 autoload_files.php / autoload_classmap.php 等自动加载文件**之后执行。不是每次 composer require 都触发——如果只是加个包但没改自动加载结构(比如只更新了已存在包的版本且无新类),钩子可能跳过。
常见错误现象:composer require foo/bar 后发现钩子没运行,其实是 Composer 判断 autoload 没变,直接跳过了 dump 步骤。
- 想强制触发?加
--no-cache或删掉vendor/autoload.php再跑composer install - 钩子不支持传参,所有逻辑得靠脚本自己判断当前是 install 还是 update(查
$_SERVER['argv']或环境变量) - 它运行时,
vendor/autoload.php已存在,但你的自定义类可能还没被加载——别在钩子里直接 new 自己的类,容易报Class not found
在 composer.json 里正确注册钩子
必须写进 "scripts" 段,且键名严格为 "post-autoload-dump"(大小写敏感,少个 - 都不行)。值可以是字符串命令、数组命令,或指向一个 PHP 方法。
{
"scripts": {
"post-autoload-dump": [
"@php build/generate-config.php",
"npm run build:assets"
]
}
}
- 数组形式会按顺序执行,任一命令失败(exit code ≠ 0),后续不会继续
- 如果用 PHP 方法,格式必须是
"MyClass::myMethod",且该类得能被 Composer 当前 autoloader 加载(推荐放src/下并确保 PSR-4 映射已生效) - 别写成
"post-autoloader-dump"或"post-autoload"——这些是无效钩子名,Composer 完全忽略
PHP 脚本里怎么安全读取 autoload 生成结果
钩子执行时,vendor/composer/autoload_*.php 文件已写好,但路径不固定(取决于 Composer 版本和配置)。别硬编码路径,用 Composer\Autoload\AutoloadGenerator 的输出逻辑反推,更稳的方式是:解析 vendor/composer/autoload_static.php 或直接读 vendor/autoload.php 的内容。
- 最简做法:在脚本开头加
require __DIR__.'/../vendor/autoload.php';,然后用class_exists()检查关键类是否可用 - 想确认 classmap 是否包含某类?读
vendor/composer/autoload_classmap.php,它是个 return 数组的 PHP 文件,可include后检查键是否存在 - 注意权限:某些 CI 环境下
vendor/是只读的,往里面写文件会失败——钩子脚本应避免直接修改vendor/下的文件
为什么 post-autoload-dump 不如 pre-autoload-dump 常用
因为它的执行时机太“晚”:自动加载机制已经就绪,你再想动态注入类映射、改 PSR-4 路径,基本无效。它适合做“收尾动作”,比如生成文档、校验类名规范、触发前端构建,而不是干预加载过程本身。
- 想在 autoload 生成前改配置?用
pre-autoload-dump,它允许你修改$vendorDir、$baseDir或调用$autoload->addPsr4() - 想让某个目录下的类总是被 classmap 扫描?在
composer.json的"classmap"里声明,别指望钩子里用命令行跑composer dump-autoload --classmap-authoritative - 性能影响:钩子脚本如果执行慢(比如跑完整单元测试),会拖慢
composer install,而这个命令常出现在部署流程中——建议把重操作拆到单独的 CI 步骤里
最容易被忽略的一点:钩子脚本里的相对路径,是以 composer.json 所在目录为基准的,不是以脚本自身位置为准。写错路径导致文件找不到,是线上构建失败最常见的原因之一。


















