post-autoload-dump是composer唯一真正稳定、必触发的事件,只要执行composer install/update且autoload文件需重建(几乎每次都会),它就一定执行,适用于生成代理类、扫描注解等轻量操作。

Composer 没有“自动脚本钩子”这种东西,只有事件(event)——它靠监听预定义的运行时事件来注入逻辑,不是靠配置一堆钩子名就能触发的。
post-autoload-dump 是唯一真正稳定、必触发的事件
只要你执行 composer install 或 composer update,只要 autoload 文件需要重建(几乎每次都会),post-autoload-dump 就一定执行。它不看 composer.lock 是否变化,也不依赖 vendor 是否为空。
- 适合做生成代理类、扫描注解、刷新运行时缓存这类轻量操作
- 回调接收的是
AutoloadDumpEvent对象,可用$event->getDumpDirectory()获取写入路径 - ⚠️ 默认不加载项目 autoloader:不能直接
new App\Service\Xxx(),必须显式require类文件,或用php -f script.php调用独立脚本 - 不要在回调里调用
composer dump-autoload,会递归触发,导致无限循环
post-update-cmd 比 post-install-cmd 更可靠
post-install-cmd 只在 vendor/ 完全不存在时才触发,重装、CI 重跑、甚至改了 composer.json 后再 install 都可能跳过它——这不是 bug,是设计行为。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
post-update-cmd在每次composer update成功后执行,开发者日常调整依赖时更常走这条路 - 它默认加载项目 autoloader,可直接使用你写的类,但要注意:如果脚本本身被放在
vendor/外且未被 autoload 规则覆盖,仍可能报错 - 命令配置写在
composer.json的scripts字段里,例如:"post-update-cmd": "php scripts/clean-cache.php"
插件中监听事件必须用 EventSubscriberInterface
想在插件里响应事件,不能靠写个函数然后配个名字;必须实现 EventSubscriberInterface,并在 getSubscribedEvents() 中返回映射数组。
- 监听器方法必须是
public static或public实例方法,匿名函数不支持 - 注册必须在
activate()方法内完成,不能在构造函数里提前绑定 - 不同事件传入的
Event子类不同:post-autoload-dump→AutoloadDumpEvent,post-package-install→PackageEvent,类型错会导致静默失败 - 监听
post-package-install时,务必用$event->getOperation()->getPackage()->getName()过滤目标包,否则每个依赖安装都会触发一次
pre-autoload-dump 是唯一能改 classmap 生成前状态的时机
如果你的任务是动态注入命名空间规则、清空旧 stub、或 require 一个不依赖 autoloader 的生成脚本,pre-autoload-dump 是唯一正解。
- 此时
vendor/已就位,但vendor/autoload.php还没写入磁盘,也没被加载 - 可以安全
require 'scripts/generate-stub.php',只要这个脚本不 new 任何第三方类、不依赖vendor/autoload.php - 它不适用于需要调用项目代码的场景——因为 autoloader 真的没加载,连你自己写的类都找不到
- 别指望它在
composer install刚开始时就运行:它发生在依赖下载和解包之后,只是 autoload 生成环节的前置点
最容易被忽略的其实是事件的作用域限制:同一个事件在插件里监听,在 composer.json 里配脚本,触发时机和上下文完全不同;而 --no-plugins、COMPOSER_DISABLE_XDEBUG 这类环境变量会让整个事件链失效,调试时得先确认插件是否真被加载了。










