2013-09-24 48 views
2

我有幾個命令的Symfony2的控制檯應用程序:如何在Symfony2控制檯應用程序中添加輔助輸出?

$application = new Application(); 

$application->add(new MyCommand1()); 
$application->add(new MyCommand2()); 

$application->run(); 

運行應用程序時,我想輸出既重定向到控制檯到一個文件中。

我可以用StreamOutput這一點,但它看起來像我只能提供這樣的輸出對象,如果我手動運行該命令之一:

$input = ...; 
$output = new StreamOutput(fopen('output.log', 'a')); 

$command = new MyCommand1(); 
$command->run($input, $output); 

但這不是我想要的。

是否可以將第二個輸出添加到Application本身?這樣所有的命令都輸出到控制檯和一個文件。

+0

你可以用獨白做 – skler

回答

3

爲了完成這個任務,我會創建自己的輸出。

class MultipleOutput implements OutputInterface 
{ 
    protected $outputs = array(); 

    public function __construct(array $outputs = array()) 
    { 
     $this->setOutputs($outputs); 
    } 

    public function setOutputs(array $outputs = array()) 
    { 
     foreach ($outputs as $output) { 
      $this->addOutput($outputs); 
     } 
    } 

    public function addOutput(OutputInterface $output) 
    { 
     $this->outputs[] = $output; 
    } 

    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) 
    { 
     foreach ($this->outputs as $output) { 
      $output->write($messages, $newline, $type); 
     } 
    } 

    public function writeln($messages, $type = self::OUTPUT_NORMAL) 
    { 
     foreach ($this->outputs as $output) { 
      $output->writeln($messages, $type); 
     } 
    } 

    public function setVerbosity($level) 
    { 
     foreach ($this->outputs as $output) { 
      $output->setVerbosity($level); 
     } 
    } 

    /** 
    * Returns only the first one 
    */ 
    public function getVerbosity() 
    { 
     foreach ($this->outputs as $output) { 
      return $output->getVerbosity(); 
     } 
    } 

    public function setDecorated($decorated) 
    { 
     foreach ($this->outputs as $output) { 
      $output->setDecorated($decorated); 
     } 
    } 

    /** 
    * Returns only the first one 
    */ 
    public function isDecorated() 
    { 
     foreach ($this->outputs as $output) { 
      return $output->isDecorated(); 
     } 
    } 

    public function setFormatter(OutputFormatterInterface $formatter) 
    { 
     foreach ($this->outputs as $output) { 
      $output->setFormatter($formatter); 
     } 
    } 

    /** 
    * Returns only the first one 
    */ 
    public function getFormatter() 
    { 
     foreach ($this->outputs as $output) { 
      return $output->getFormatter(); 
     } 
    } 
} 

然後你就可以在你的應用程序中使用它

$application = new Application(); 

$application->add(new MyCommand1()); 
$application->add(new MyCommand2()); 

$output = new MultipleOutput(array(new StreamOutput, new ConsoleOutput)); 

$application->run(new ArgvInput, $output); 
+0

謝謝,我錯過了事實,你實際上可以傳遞一個輸出到'申請::的run() '! – Benjamin

+0

這個'MultipleOutput'可能會在Symfony中很有用,拉請求呢? – Benjamin

+0

@Benjamin我可能會試試遲早! – Touki

相關問題