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(); |