1

我有一个像这样的 Symfony 5 命令:

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

....

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $this->input        = $input;
        $this->output       = $output;
        $this->io           = new SymfonyStyle($input, $output);
        ....
    }

此命令会生成大量带有$this->io->caution(...)$this->io->block(....)等 的输出$this->io->text(....)

有时(并非总是:存在一些运行时条件),在执行结束时,我想访问命令生成的整个输出,然后通过电子邮件发送。所以....我怎样才能取回OutputInterface所显示的一切?有没有一种$this->output->getBuffer()

只要我现在仍然可以在标准输出(我的终端)上显示所有内容,我就可以毫无问题OutputInterface $output地与其他东西(logger ,也许?)交换。

4

1 回答 1

2

我认为没有任何现成的东西可以为您完成此任务。您可以使用记录器实现类似的目标......但是您将不得不在配置错误级别上摆弄很多,可能会注入多个记录器,控制台输出永远不会与 by 匹配SymfonyStyle,等等。

您最好自己构建,这应该不是特别困难。只需构建一些包装/装饰的东西SymfonyStyle;并捕获输出。

我将提供起始构建块,由您完成实现:

class LoggingStyle
{
    private SymfonyStyle $style;
    private array        $logEntries = [];

    public function __construct(InputInterface $input, OutputInterface $output) {
        $this->style = new SymfonyStyle($input, $output);
    }

    private function addLog(string $type, string $message): void
    {
        $this->logEntries[] = [
            'type' => $type,
            'message' => $message,
            'time' => date('Y-m-d H:i:s')
        ];
    }

    public function flushLog():array
    {
        $log = $this->logEntries;
        $this->logEntries = [];

        return $log;
    }

    public function caution(string $message): void
    {
        $this->addLog('caution', $message);
        $this->style->caution($message);
    }

    public function text(string $message): void
    {
        $this->addLog('text', $message);
        $this->style->caution($message);
    }

    public function block(string $message): void
    {
        $this->addLog('block', $message);
        $this->style->caution($message);
    }
}

您需要实现SymfonyStyle您需要使用的界面的每个部分,并决定如何处理一些特殊行为,如果有的话(例如,像 , 或进度条这样的东西ask()table()。但这完全取决于您的实施。

还要决定如何格式化电子邮件中每种不同的输出样式,因为从逻辑上讲,没有办法直接翻译它。

您可以直接使用此类,如果您需要聚合输出,您只需调用LoggingStyle::flushLog()并以数组形式获取所有条目,以便您进行相应的处理和发送。

于 2020-04-03T06:37:57.980 回答