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

Composer 是 PHP 的依赖管理工具,除了安装和更新包之外,它还支持通过插件机制扩展自身功能。编写一个 Composer 插件可以让你在 Composer 执行过程中注入自定义逻辑,比如在安装包后自动执行脚本、修改配置行为或集成第三方服务。本文将带你一步步创建你的第一个 Composer 插件。
理解 Composer 插件的基本原理
Composer 插件本质上是一个特殊的 Composer 包,它实现了 Composer\Plugin\PluginInterface 接口,并在激活时向 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"
{ "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('Hello from my first Composer plugin! '); // 可在此注册事件监听器或自定义命令 } public function deactivate(Composer $composer, IOInterface $io) { // 插件停用时调用(可选) } public function uninstall(Composer $composer, IOInterface $io) { // 插件卸载时调用(可选) } }
测试你的插件
要测试插件是否正常工作,可以在另一个项目中通过 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 Composer\EventDispatcher\EventSubscriberInterface; use Composer\Script\Event; 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('Clean up cache after install. '); // 自定义逻辑,比如生成文件、清理缓存等 } public function onPostUpdate(Event $event) { $event->getIO()->write('Dependencies updated, run checks now. '); } } - 确保类同时实现 EventSubscriberInterface 并正确返回事件映射。
基本上就这些。你现在拥有了一个可被 Composer 加载并在关键节点执行任务的插件。随着需求增长,你还可以注册自定义命令、修改包加载逻辑或与外部系统通信。
不复杂但容易忽略的是 autoload 配置和接口实现的完整性。只要结构清晰,Composer 插件是增强项目自动化流程的有力工具。










