首先创建一个类型为composer-plugin的包,实现PluginInterface接口,并在activate方法中注入逻辑;通过EventSubscriberInterface订阅post-install-cmd等事件,在指定时机执行自定义操作,如输出提示或清理缓存;最终通过path方式在测试项目中引入并验证插件功能。

Composer 是 php 的依赖管理工具,除了安装和更新包之外,它还支持通过插件机制扩展自身功能。编写一个 Composer 插件可以让你在 Composer 执行过程中注入自定义逻辑,比如在安装包后自动执行脚本、修改配置行为或集成第三方服务。本文将带你一步步创建你的第一个 Composer 插件。
理解 Composer 插件的基本原理
Composer 插件本质上是一个特殊的 Composer 包,它实现了 ComposerPluginPluginInterface 接口,并在激活时向 Composer 注册事件监听器或命令。当 Composer 启动并检测到已安装的插件时,会自动加载并运行它们。
关键点:
- 插件必须声明类型为 composer-plugin。
- 需要实现 PluginInterface 中的
activate()方法。 - 可通过
getSubscribedEvents()订阅 Composer 生命周期中的事件,如post-install-cmd或pre-update-dump。
创建你的第一个 Composer 插件
我们来写一个简单的插件,在每次执行 composer install 或 composer update 后输出一条提示信息。
- 初始化项目目录
mkdir my-composer-plugin cd my-composer-plugin composer init - 填写 composer.json 基本信息
- name: your-name/my-composer-plugin
- type: composer-plugin
- require: 添加 “composer-plugin-api”: “^2.0” 和 “composer/composer”: “^2.0”
最终的 composer.json 应类似:
{ "name": "your-name/my-composer-plugin", "type": "composer-plugin", "require": { "composer-plugin-api": "^2.0", "composer/composer": "^2.0" }, "autoload": { "psr-4": { "MyComposerPlugin\": "src/" } } } - 创建插件主类 在项目中创建目录
src/,然后添加文件src/MyPlugin.php:write(' '); // 可在此注册事件监听器或自定义命令 } public function deactivate(Composer $composer, IOInterface $io) { // 插件停用时调用(可选) } public function uninstall(Composer $composer, IOInterface $io) { // 插件卸载时调用(可选) } }Hello from my first Composer plugin!
测试你的插件
要测试插件是否正常工作,可以在另一个项目中通过 path 方式引入本地插件。
- 在测试项目的
composer.json中添加仓库:"repositories": [ { "type": "path", "url": "../my-composer-plugin" } ] - 安装你的插件:
composer require your-name/my-composer-plugin:@dev - 执行
composer install,你应该能看到输出:Hello from my first Composer plugin!
进阶:监听 Composer 事件
你可以让插件在特定时机执行操作。例如监听 post-install-cmd 事件:
- 在
MyPlugin类中添加:use ComposerEventDispatcherEventSubscriberInterface; use ComposerScriptEvent; class MyPlugin implements PluginInterface, EventSubscriberInterface { public function activate(Composer $composer, IOInterface $io) { // 激活时不直接做操作 } public static function getSubscribedEvents() { return [ 'post-install-cmd' => 'onPostInstall', 'post-update-cmd' => 'onPostUpdate' ]; } public function onPostInstall(Event $event) { $event->getIO()->write(''); // 自定义逻辑,比如生成文件、清理缓存等 } public function onPostUpdate(Event $event) { $event->getIO()->write(''); } } - 确保类同时实现 EventSubscriberInterface 并正确返回事件映射。
基本上就这些。你现在拥有了一个可被 Composer 加载并在关键节点执行任务的插件。随着需求增长,你还可以注册自定义命令、修改包加载逻辑或与外部系统通信。
不复杂但容易忽略的是 autoload 配置和接口实现的完整性。只要结构清晰,Composer 插件是增强项目自动化流程的有力工具。