在开发 Composer 插件时,获取 IO 对象的核心方式取决于执行上下文:在事件回调中使用 $event->getIO(),在自定义命令中可通过 ConsoleIO 构造或依赖注入获取,用于输出信息、提示输入等交互操作。

在开发 Composer 插件时,如果你需要与用户交互,比如输出信息、提示输入或显示进度条,就需要使用 IO(Input/Output)对象。这个对象由 Composer 在运行时注入,通常通过命令的执行上下文传递。
通过 Command 的 execute 方法获取 IO
大多数情况下,你的插件会实现一个自定义命令。Composer 会在执行命令时传入 InputInterface 和 OutputInterface,你可以通过它们构建 IOInterface 实例。
Composer 提供了一个 IOInterface 接口,常用的实现是 Composer\IO\IOInterface,而实际运行时传入的是 Composer\IO\ConsoleIO。
- 在自定义命令的
execute()方法中,可以通过$input和$output构造IOInterface - 如果你使用了
CommandEvent或其他事件钩子,IO 对象会直接提供
在 EventListener 中获取 IO 对象
如果你的插件监听如 ScriptEvents::POST_INSTALL_CMD 等事件,可以通过事件对象获取 IO。
use Composer\Script\Event;
public static function postInstall(Event $event)
{
$io = $event->getIO();
$io->writeError('Hello from plugin! ');
}
$event->getIO() 是最直接的方式,适用于脚本事件回调。
在自定义命令中使用 ConsoleIO
如果你继承了 Command 类并实现自己的逻辑:
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Composer\IO\IOInterface;
use Composer\IO\ConsoleIO;
protected function execute(InputInterface $input, OutputInterface $output)
{
$composer = $this->requireComposer();
$io = new ConsoleIO($input, $output, $this->getHelperSet(), $composer->getConfig());
$io->writeError('This is an error message.');
$io->write('This is a normal message.');
return 0;
}
注意:虽然可以手动创建 ConsoleIO,但更推荐通过依赖注入或事件机制获取已有实例。
关键点总结
获取 IO 对象的核心方式取决于你插件的执行上下文:
- 事件回调中用
$event->getIO() - 自定义命令中可封装
ConsoleIO,或从应用容器获取 - 确保引入正确的命名空间:
Composer\IO\IOInterface和Composer\IO\ConsoleIO
基本上就这些。只要理解 Composer 的执行流程,IO 对象的获取就很自然。








