我有一个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组件缩进?
答案 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)