Contributed by
Pierre du Plessis
in #24363.

Console组件 在 Symfony组件中人气第二高 (8200万次下载!),内含劲爆功能。在 Symfony 4.1 中我们用 创建和操作多个output段落 进一步强化了它。

目前,在命令行中显示信息是很平常的操作:

1
2
3
4
5
6
7
8
9
10
11
class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Display some information...');
 
        // ...
 
        $output->writeln('Display more information...');
    }
}

在 Symfony 4.1 中,你将可以显示信息、覆写信息、删除部分信息、同时更新输出内容的不同部分。新的操作是基于 "output sections" 的,各段落区间皆被 console output 所独立控制:

1
2
3
4
5
6
7
8
9
class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $section = $output->section();
        $section->writeln('Display some information...');
        // ...
    }
}

覆写输出内容

全新的 overwrite() 删除全部段落的内容,并把它们替换为给定的内容:

1
2
3
4
5
6
7
$section = $output->section();
$section->writeln('Downloading the file...');
// ...
$section->overwrite('Uncompressing the file...');
// ...
$section->overwrite('Copying the contents...');
// ...

删除输出内容

全新的 clear(int $numLines) 删除最后的 $numLines 个段落 (或全部内容,如果没有参数提供的话):

1
2
3
4
5
6
7
8
$section = $output->section();
$section->writeln('Welcome to the installation Process!');
$section->writeln('Downloading the file...');
$section->writeln('Uncompressing the file...');
$section->writeln('Copying the contents...');
// ...
$section->clear(3);
$section->writeln('The installation is complete!');

增补行数来生成表格

在之前的 Symfony 版本中,显示表格需要知道全部的行数和列数。但是,全新的 appendRow() 方法,配合已有的 addRow() 方法,让你能够为已经显示出来的表格添加新行:

1
2
3
4
5
6
7
8
9
10
11
$section = $output->section();
$table = new Table($section);
 
$table->addRow(['Row 1']);
// display the table with the known contents
// 显示包含了已有内容的表格
$table->render();
 
// add a new row with new contents to the already displayed table
// 对已经显示出的表格,用新内容增加一个新行
$table->appendRow(['Row 2']);

管理多个outputs

最有趣的新功能是,你可以根据需要创建任意多的output段落,并分别控制它们。下例在表格被更新时会显示进度条,当命令完成时,进度条被删除而表格被保留:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$section1 = $output->section();
$section2 = $output->section();
 
$progress = new ProgressBar($section1);
$progress->start(5);
 
$table = new Table($section2);
$table->addRow(['Row 1']);
$table->render();
 
foreach ($rowsToProcess as $i => $row) {
    $table->appendRow(['Row '.$i++]);
    $progress->advance();
    // ...
}
 
$progress->finish();
$section1->clear();