Symfony 4.1 Console组件 的一个主要功能就是 高级output 控制,可以让你同时更新outputs的不同部分。但是,我们也改进了Console 命令行的其他微小地方。

自动运行建议的命令

Contributed by
Pierre du Plessis
in #25732.

在 Symfony 中,当你输错了命令的名字时,你会看到错误信息和一个拥有相似名称的命令列表。在 Symfony 4.1 中,当只有一个可选命令时,你拥有一个立即执行的选项:

1
2
3
4
$  ./bin/console app:user:impot
 
  Command "app:user:impot" not defined.
  Do you want to run "app:user:import" instead? [y/n]

新表格样式

Contributed by
Dany Maillard
in #25301 and #26693.

在 Symfony 4.1 中,作为命令行一部分而输出的表格可以选择两个名为 boxbox-double 的新样式:

1
2
$table->setStyle('box');
$table->render();
1
2
3
4
5
6
7
8
┌───────────────┬──────────────────────────┬──────────────────┐
│ 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 │
│ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  │
└───────────────┴──────────────────────────┴──────────────────┘
1
2
$table->setStyle('box-double');
$table->render();
1
2
3
4
5
6
7
8
╔═══════════════╤══════════════════════════╤══════════════════╗
║ 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 ║
║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie  ║
╚═══════════════╧══════════════════════════╧══════════════════╝

自定义表格的新方法

Contributed by
Dany Maillard
in #25456.

除了新的表格样式,在 Symfony 4.1 中我们降格了一些方法 (setHorizontalBorderChar(), setVerticalBorderChar(), setCrossingChar()),以便引入更强力的方法来让你自定义每一个用于绘制表格边框的字符。

例如,全新的 setCrossingChars() 可以定制9种不同的边框字符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public function setCrossingChars(
    string $cross, string $topLeft, string $topMid, string $topRight,
    string $midRight, string $bottomRight, string $bottomMid,
    string $bottomLeft, string $midLeft
);
 
// * 1---------------2-----------------------2------------------3
// | ISBN          | Title                 | Author           |
// 8---------------0-----------------------0------------------4
// | 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 |
// 7---------------6-----------------------6------------------5
 
// @param string $cross       Crossing char (see #0 of example)
// @param string $topLeft     Top left char (see #1 of example)
// @param string $topMid      Top mid char (see #2 of example)
// @param string $topRight    Top right char (see #3 of example)
// @param string $midRight    Mid right char (see #4 of example)
// @param string $bottomRight Bottom right char (see #5 of example)
// @param string $bottomMid   Bottom mid char (see #6 of example)
// @param string $bottomLeft  Bottom left char (see #7 of example)
// @param string $midLeft     Mid left char (see #8 of example)

增加对 outputting iterators 输出迭代器的支持

在 Symfony 4.1 中,命令行的 write() 和了writeln() 方法 (也包括 SymfonyStyle output) 支持传入返回字符串的iterator:

1
2
3
4
5
6
7
8
9
10
11
private function generateMessages(): iterable
{
    yield 'foo';
    yield 'bar';
}
 
// ...
$output->writeln($this->generateMessages());
// Output will be:
// foo\n
// bar\n