运行Symfony命令时如何使用非默认的Output对象?

时间:2016-03-25 16:24:54

标签: php symfony

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频道。能够为每个命令定制输出对象会很有帮助,因为每个命令可能会影响不同的团队。

1 个答案:

答案 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);
    }
}