必须将自定义php函数包装为脚本文件或类方法,并通过post-update-cmd触发;类需声明在autoload-dev下且方法为public static,脚本需正确require autoload并配置autoload.files,修改后须执行composer dump-autoload。

不能直接执行“自定义 PHP 函数”——必须包装成可调用单元(脚本文件或类方法),且需确保加载时机正确。
post-update-cmd 是更可靠的选择,而非 post-install-cmd
很多人误以为 post-install-cmd 是安装后触发的“万能钩子”,但它在首次运行 composer install 时不会执行(因为此时 vendor/autoload.php 尚未生成,Composer 无法加载任何类)。而 post-update-cmd 每次 composer update 或 composer install(非首次)都会触发,稳定性高得多。
-
post-install-cmd只在vendor/autoload.php已存在时才运行,适合“二次安装”场景 -
post-update-cmd总是运行,且 Composer 已完成 autoloader 构建,类/函数基本可用 - 若你真需要“首次安装即生效”,得靠外部 wrapper 脚本(如 shell +
composer install && php scripts/first-run.php),不能依赖 Composer 内置钩子
用类方法当钩子:autoload-dev + public static 是硬要求
想在 scripts 里写 "MyAppScripts::onUpdate",光有类文件远远不够。Composer 不会自动加载它,除非你提前告诉它怎么找。
- 类必须声明在
autoload-dev(不是autoload)下,例如:{ "autoload-dev": { "psr-4": { "MyApp\Scripts\": "src/Scripts/" } } } - 方法必须是
public static,且参数可选($event是ComposerScriptEvent实例) - 别在方法里
require 'vendor/autoload.php'—— Composer 已加载好,重复 require 可能破坏命名空间解析 - 测试是否注册成功:加
-v运行命令,看到Executing script MyAppScripts::onUpdate才算到位
用独立 PHP 脚本文件:路径、权限、无 shebang
比起类方法,写一个 scripts/post-update.php 更直觉,但细节更易翻车。
- 脚本第一行**不能**写
#!/usr/bin/env php—— Composer 不走 shebang,会报Parse error或静默失败 - 路径必须相对于项目根目录,且在
scripts数组中写成数组格式:["php", "scripts/post-update.php"],避免 shell 解析歧义 - Linux/macOS 下需
chmod +x scripts/post-update.php;Windows 可省略,但统一用php显式调用更稳妥 - 脚本开头必须
require __DIR__.'/../vendor/autoload.php';,否则所有类和autoload.files定义的函数都不可用
函数文件本身要进 autoload.files,且 dump-autoload 不可跳过
如果你的自定义逻辑依赖 src/helpers.php 里的 str_slug() 这类函数,光把类方法写对还不够——函数得先被加载进来。
- 必须在
composer.json的autoload.files里显式列出:"autoload": { "files": ["src/helpers.php"] } - 改完
composer.json后,**必须**运行composer dump-autoload(或composer install),否则vendor/autoload.php里根本没这行require - 函数文件里禁止
echo、exit、return或未捕获异常,否则整个 autoload 流程中断,报Call to undefined function - 多个函数文件按数组顺序加载,后加载的同名函数会覆盖前面的,无提示
最常被忽略的是:你以为函数“写完就能用”,其实它卡在 autoload 链的起点——没 dump-autoload,就没加载;没正确 require autoload,脚本里就看不到函数;而 post-install-cmd 在首次安装时压根不跑,连验证机会都没有。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











