2

Symfony のコンソール出力コンポーネントを既存の Symfony 以外のアプリに含めようとしていますが、全体的にはうまくいっています。

まだ私を逃しているように見えることの 1 つは、ProgressBar クラスを使用すると、送信しているすべての出力がプログレス バーの幅だけパディングされているように見えることです。

コードの大まかな概要は次のとおりです (さまざまな不要な部分が削除されています)。

public function run() {
    $this->logger = new \Symfony\Component\Console\Output\StreamOutput(fopen('php://stdout', 'w'));
    $this->logger->setVerbosity(\Symfony\Component\Console\Output\OutputInterface::VERBOSITY_DEBUG);
    $this->progress = new \Symfony\Component\Console\Helper\ProgressBar($this->logger);

    $this->progress->start();
    $this->doStepOne();
    $this->progress->finish();
}

public function doStepOne() {
    $i = 1;
    while($i < 10000000000) {
        $this->info(sprintf('Sweet, done a thing on page #%d', $i));
    }
}

public function info($message) {
    $this->log(sprintf("<info>%s</info>", $message));
}

public function log($message) {
    // This follows advice from http://symfony.com/doc/current/components/console/helpers/progressbar.html indicating that if you output content, you should ->clear() first and ->display() after.
    // If I don't do this, then the progress bar is output on every line, immediately followed by $message
    $this->progress->clear();
    $this->logger->writeln($message);
    $this->progress->advance();
    $this->progress->display();
}

したがって、すべてが非常に簡単に見えます。繰り返しますが、私は Symfony コンソール出力内でこれを使用していないので、おそらくそれが理由ですが、奇妙に思えるので、他の誰かがそれに遭遇したかどうかを確認したいと思いました. Google-fu を使用しても何も見つかりませんでしたが、弱いのでしょうか?

例 (^C 文字は無視してください。これは、プロセスを終了するための Ctrl-C です): また、混乱を解消するために、最初に表示されている行には、追加したインデントがなく、2 行目には1 つのスペース文字があります。自分で挿入したインデント、混乱をお詫びします。 問題の例

4

1 に答える 1

0

ConsoleOutputまた、ストリームを使用して、Symfony 2.7 を使用してこれを観察しました。私が「修正」した方法は、ANSI の削除から開始までのシーケンスを手動で出力に挿入することでした。コードを変更すると、次のようになります。

if ($this->logger->isDecorated()) {
    $this->logger->write("\x0D");
}

かわいくない。

2.8 の時点で、この動作はまだ存在します。それがバグなのかどうかはわかりません。みたいですけどね。

于 2015-11-30T20:32:02.593 に答える