如何使用symfony2 compoments OutputInterface和Table帮助器缩进写入操作?

时间:2015-08-11 16:18:48

标签: php symfony console-application string-formatting

我有一个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以及Table帮助程序的symfony2组件缩进?

1 个答案:

答案 0 :(得分:4)

这可以完成工作

输出装饰器

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

输出:

function createChatBox(chatboxtitle,minimizeChatBox)