Symfony provides other classes that implement OutputInterface
。如何将这些类的实例(最好是从命令行或其他配置选项)提供给命令?
我目前使用不同输出对象的解决方法是立即将$output
重新分配给首选对象,如下所示:
<?php
namespace AppBundle\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\NullOutput;
class DebugCommand extends Command
{
protected function Configure()
{
$this->setName('AppBundle:DebugCommand');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output = new NullOutput();
$output->writeln('Done!');
}
}
但这感觉很草率。简单地将目标对象作为参数提供给DebugCommand::execute()
会更有意义。另外,如果我决定我想要输出 - 我将不得不修改代码以获得预期的行为。
如何正确实现这一目标?
修改
我希望可以为每个命令设置默认值。这会很有用,因为我可以创建一个实现OutputInterface
的新类,它会将输出发布到我的团队的Slack通道。但是一个不同的命令可能需要发布到不同的团队的Slack频道。能够为每个命令定制输出对象会很有帮助,因为每个命令可能会影响不同的团队。
答案 0 :(得分:1)
当您使用框架时,您的控制台脚本中确实有类似的代码:
$application = new Application($kernel);
$application->setDefaultCommand('default');
$application->run($input);
你现在可以做的是在run函数中添加第二个参数,例如:
$application->run($input, new NullOutput());
修改强>
如何按命令执行此操作需要一个扩展Application类的新类:
class SlackOutputApplication extends Application{
protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
{
if ($command->getName() == 'foo') {
$output = new SlackOutput('channelname');
}
parent::doRunCommand($command, $input, $output);
}
}