如何使用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