其他分享
首页 > 其他分享> > 如何使用symfony2 compoments OutputInterface和表助手缩进写操作?

如何使用symfony2 compoments OutputInterface和表助手缩进写操作?

作者:互联网

我有一个OutputInterface,我用它通过Table帮助程序将一堆表写到它们上.该信息具有嵌套上下文,因此我希望输出缩进4个空格.

我认为这样的事情应该可行:

 new Table($output);
 $output->writeln('0. run');
 $someTable->render();
 $output->increaseIndentLevel(); // pseudocode
 $output->writeln('1. run');
 $someTable->render();

创建预期的输出:

0. run
+---------------+-----------------------+------------------+
| ISBN          | Title                 | Author           |
+---------------+-----------------------+------------------+
| 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
| 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
| 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
+---------------+-----------------------+------------------+
     1. run
     +---------------+-----------------------+------------------+
     | ISBN          | Title                 | Author           |
     +---------------+-----------------------+------------------+
     | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
     | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
     +---------------+-----------------------+------------------+

我搜索了实现此方法的方法.我注意到OutputInterface提供了OutputFormatterStyle,但这似乎只能更改文本的颜色,可以设置一些与在写操作之前或之后添加内容无关的选项.

我可以扩展一个OutputInterface,例如ConsoleOutput,但我也希望能够将此功能也添加到任何OutputInterfaces(例如BufferedOutput),而不必为每个接口创建手动版本.

我最后的尝试是将自己的OutputFormatter注入OutputInterface:

<?php
namespace Hive\App;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterStyleInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * IndentedOutputFormatter
 **/
class IndentedOutputFormatter extends OutputFormatter
{
    const INDENT_AMOUNT = 4;

    private $indentLevel = 0;

    /**
     * Formats a message according to the given styles.
     * @param string $message The message to style
     * @return string The styled message
     * @api
     */
    public function format($message)
    {
        $message = parent::format($message);
        if ($this->indentLevel === 0) {
            return $message;
        }

        $amount = self::INDENT_AMOUNT * $this->indentLevel;
        $prependBy = str_repeat(' ', $amount);
        $message = $prependBy . $message;

        return $message;
    }

    /**
     *
     */
    public function increaseLevel()
    {
        $this->indentLevel = $this->indentLevel + 1;
    }

    /**
     *
     */
    public function decreaseLevel()
    {
        $this->indentLevel = $this->indentLevel - 1;
    }
}

并从命令中像这样使用它:

/**
 * @param InputInterface  $input
 * @param OutputInterface $output
 * @return int
 */
protected function execute(InputInterface $input, OutputInterface $output)
{
    $headers = [
        'ISBN',
        'Title',
        'Author',
    ];

    $rows = [
        [
            '99921-58-10-7',
            'Divine Comedy',
            'Dante Alighieri',

        ],
        [
            '9971-5-0210-0',
            'A Tale of Two Cities',
            'Charles Dickens',

        ],
        [
            '960-425-059-0',
            'The Lord of the Rings',
            'J. R. R. Tolkien',
        ],
    ];


    $formatter = new IndentedOutputFormatter();
    $output->setFormatter($formatter);
    $table = new Table($output);
    $table->setHeaders($headers);
    $table->setRows($rows);

    foreach (range(0, 3) as $currentRun) {
        $output->writeln("$currentRun. run");
        $formatter->increaseLevel();
        $table->render();
    }

    return 0;
}

但这产生了一个问题,不仅表是通过缩进呈现的,还包括它的内容字段:

0. run
    +-------------------+---------------------------+----------------------+
    |     ISBN              |     Title                     |     Author               |    
    +-------------------+---------------------------+----------------------+
    |     99921-58-10-7     |     Divine Comedy             |     Dante Alighieri      |    
    |     9971-5-0210-0     |     A Tale of Two Cities      |     Charles Dickens      |    
    |     960-425-059-0     |     The Lord of the Rings     |     J. R. R. Tolkien     |    
    +-------------------+---------------------------+----------------------+
    1. run
        +-----------------------+-------------------------------+--------------------------+
        |         ISBN                  |         Title                         |         Author                   |        
        +-----------------------+-------------------------------+--------------------------+
        |         99921-58-10-7         |         Divine Comedy                 |         Dante Alighieri          |        
        |         9971-5-0210-0         |         A Tale of Two Cities          |         Charles Dickens          |        
        |         960-425-059-0         |         The Lord of the Rings         |         J. R. R. Tolkien         |        
        +-----------------------+-------------------------------+--------------------------+
        2. run
            +---------------------------+-----------------------------------+------------------------------+
            |             ISBN                      |             Title                             |             Author                       |            
            +---------------------------+-----------------------------------+------------------------------+
            |             99921-58-10-7             |             Divine Comedy                     |             Dante Alighieri              |            
            |             9971-5-0210-0             |             A Tale of Two Cities              |             Charles Dickens              |            
            |             960-425-059-0             |             The Lord of the Rings             |             J. R. R. Tolkien             |            
            +---------------------------+-----------------------------------+------------------------------+
            3. run
                +-------------------------------+---------------------------------------+----------------------------------+
                |                 ISBN                          |                 Title                                 |                 Author                           |                
                +-------------------------------+---------------------------------------+----------------------------------+
                |                 99921-58-10-7                 |                 Divine Comedy                         |                 Dante Alighieri                  |                
                |                 9971-5-0210-0                 |                 A Tale of Two Cities                  |                 Charles Dickens                  |                
                |                 960-425-059-0                 |                 The Lord of the Rings                 |                 J. R. R. Tolkien                 |                
                +-------------------------------+---------------------------------------+----------------------------------+

如何使用缩进和OutputInterface的symfony2组件以及表格助手来工作?

解决方法:

这做好了

输出装饰器

use Symfony\Component\Console\Output\Output;

class IndentedOutput extends Output
{
    const INDENT_AMOUNT = 4;

    private $output;
    private $indentLevel = 0;
    private $resetLine = false;

    public function setOutput(OutputInterface $output)
    {
        $this->output = $output;
    }

    public function increaseLevel()
    {
        $this->indentLevel += 1;
    }

    public function decreaseLevel()
    {
        $this->indentLevel -= 1;
    }

    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
    {
        $prependBy = str_repeat(' ', self::INDENT_AMOUNT * $this->indentLevel);

        if ($newline) {
            $this->resetLine = true;
            $messages = $prependBy.$messages;
        }

        if ($this->resetLine && !$newline) {
            $messages = $prependBy.$messages;
            $this->resetLine = false;
        }

        $this->output->write($messages, $newline, $type);
    }

    public function doWrite($message, $newline)
    {
        $this->output->doWrite($message, $newline);
    }
}

测试

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\BufferedOutput;

$headers = [
    'ISBN',
    'Title',
    'Author',
];

$rows = [[
    '99921-58-10-7',
    'Divine Comedy',
    'Dante Alighieri',

],[
    '9971-5-0210-0',
    'A Tale of Two Cities',
    'Charles Dickens',

],[
    '960-425-059-0',
    'The Lord of the Rings',
    'J. R. R. Tolkien',
]];

$app = new Application();
$app
    ->register('foo')
    ->setCode(function(InputInterface $input, OutputInterface $output) use ($headers, $rows) {

        $buffered = new BufferedOutput;
        $indented = new IndentedOutput;
        $indented->setOutput($buffered);

        $table = new Table($indented);
        $table->setHeaders($headers);
        $table->setRows($rows);

        foreach (range(0, 3) as $currentRun) {
            $indented->writeln("$currentRun. run");
            $table->render();
            $indented->increaseLevel();
        }

        $indented->decreaseLevel();
        $indented->decreaseLevel();
        $indented->decreaseLevel();
        $indented->decreaseLevel();
        $indented->write('hello world');

        $output->write($buffered->fetch());
    });
$app->run();

输出:

0. run
+---------------+-----------------------+------------------+
| ISBN          | Title                 | Author           |
+---------------+-----------------------+------------------+
| 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
| 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
| 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
+---------------+-----------------------+------------------+
    1. run
    +---------------+-----------------------+------------------+
    | ISBN          | Title                 | Author           |    
    +---------------+-----------------------+------------------+
    | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |    
    | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |    
    | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |    
    +---------------+-----------------------+------------------+
        2. run
        +---------------+-----------------------+------------------+
        | ISBN          | Title                 | Author           |        
        +---------------+-----------------------+------------------+
        | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |        
        | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |        
        | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |        
        +---------------+-----------------------+------------------+
            3. run
            +---------------+-----------------------+------------------+
            | ISBN          | Title                 | Author           |            
            +---------------+-----------------------+------------------+
            | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |            
            | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |            
            | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |            
            +---------------+-----------------------+------------------+
hello world

标签:symfony,string-formatting,console-application,php
来源: https://codeday.me/bug/20191028/1949002.html