Table

When building a console application it may be useful to display tabular data:

コンソール アプリケーションを作成する場合、表形式のデータを表示すると便利な場合があります。
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  |
+---------------+--------------------------+------------------+

To display a table, use Table, set the headers, set the rows and then render the table:

テーブルを表示するには、Table を使用し、ヘッダーを設定し、行を設定してから、テーブルをレンダリングします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
// ...

class SomeCommand extends Command
{
    public function execute(InputInterface $input, OutputInterface $output): int
    {
        $table = new Table($output);
        $table
            ->setHeaders(['ISBN', 'Title', 'Author'])
            ->setRows([
                ['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'],
            ])
        ;
        $table->render();
        
        return Command::SUCCESS;
    }
}

You can add a table separator anywhere in the output by passing an instance of TableSeparator as a row:

TableSeparator のインスタンスを行として渡すことにより、出力の任意の場所にテーブル セパレータを追加できます。
1
2
3
4
5
6
7
8
9
use Symfony\Component\Console\Helper\TableSeparator;

$table->setRows([
    ['99921-58-10-7', 'Divine Comedy', 'Dante Alighieri'],
    ['9971-5-0210-0', 'A Tale of Two Cities', 'Charles Dickens'],
    new TableSeparator(),
    ['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
3
4
5
6
7
8
9
+---------------+--------------------------+------------------+
| 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  |
+---------------+--------------------------+------------------+

You can optionally display titles at the top and the bottom of the table:

オプションで、テーブルの上部と下部にタイトルを表示できます。
1
2
3
4
// ...
$table->setHeaderTitle('Books');
$table->setFooterTitle('Page 1/2');
$table->render();
1
2
3
4
5
6
7
8
9
+---------------+----------- Books --------+------------------+
| 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  |
+---------------+--------- Page 1/2 -------+------------------+

By default, the width of the columns is calculated automatically based on their contents. Use the setColumnWidths() method to set the column widths explicitly:

デフォルトでは、列の幅は内容に基づいて自動的に計算されます。 setColumnWidths() メソッドを使用して、列幅を明示的に設定します。
1
2
3
// ...
$table->setColumnWidths([10, 0, 30]);
$table->render();

In this example, the first column width will be 10, the last column width will be 30 and the second column width will be calculated automatically because of the 0 value.

この例では、最初の列幅は 10 になり、最後の列幅は 30 になり、2 番目の列幅は値が 0 であるため、自動的に計算されます。

You can also set the width individually for each column with the setColumnWidth() method. Its first argument is the column index (starting from 0) and the second argument is the column width:

setColumnWidth() メソッドを使用して、各列の幅を個別に設定することもできます。最初の引数は列のインデックス (0 から開始) で、2 番目の引数は列の幅です。
1
2
3
4
// ...
$table->setColumnWidth(0, 10);
$table->setColumnWidth(2, 30);
$table->render();

The output of this command will be:

このコマンドの出力は次のようになります。
1
2
3
4
5
6
7
8
9
+---------------+--------------------------+--------------------------------+
| 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                |
+---------------+--------------------------+--------------------------------+

Note that the defined column widths are always considered as the minimum column widths. If the contents don't fit, the given column width is increased up to the longest content length. That's why in the previous example the first column has a 13 character length although the user defined 10 as its width.

定義された列幅は、常に最小の列幅と見なされることに注意してください。コンテンツが収まらない場合は、指定された列幅がコンテンツの最長の長さまで拡大されます。これが、前の例で、ユーザーが幅として 10 を定義したにもかかわらず、最初の列の長さが 13 文字である理由です。

If you prefer to wrap long contents in multiple rows, use the setColumnMaxWidth() method:

長いコンテンツを複数の行にラップする場合は、setColumnMaxWidth() メソッドを使用します。
1
2
3
4
// ...
$table->setColumnMaxWidth(0, 5);
$table->setColumnMaxWidth(1, 10);
$table->render();

The output of this command will be:

このコマンドの出力は次のようになります。
1
2
3
4
5
6
7
8
+-------+------------+--------------------------------+
| ISBN  | Title      | Author                         |
+-------+------------+--------------------------------+
| 99921 | Divine Com | Dante Alighieri                |
| -58-1 | edy        |                                |
| 0-7   |            |                                |
|                (the rest of the rows...)            |
+-------+------------+--------------------------------+

By default, table contents are displayed horizontally. You can change this behavior via the setVertical() method:

デフォルトでは、表の内容は水平に表示されます。 setVertical() メソッドを使用して、この動作を変更できます。
1
2
3
// ...
$table->setVertical();
$table->render();

The output of this command will be:

このコマンドの出力は次のようになります。
1
2
3
4
5
6
7
8
9
+------------------------------+
|   ISBN: 99921-58-10-7        |
|  Title: Divine Comedy        |
| Author: Dante Alighieri      |
|------------------------------|
|   ISBN: 9971-5-0210-0        |
|  Title: A Tale of Two Cities |
| Author: Charles Dickens      |
+------------------------------+

6.1

6.1

Support for vertical rendering was introduced in Symfony 6.1.

垂直レンダリングのサポートは Symfony 6.1 で導入されました。

The table style can be changed to any built-in styles via setStyle():

テーブル スタイルは、setStyle() を介して任意の組み込みスタイルに変更できます。
1
2
3
4
5
6
// same as calling nothing
$table->setStyle('default');

// changes the default style to compact
$table->setStyle('compact');
$table->render();

This code results in:

このコードの結果は次のとおりです。
1
2
3
4
5
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

You can also set the style to borderless:

スタイルをボーダーレスに設定することもできます。
1
2
$table->setStyle('borderless');
$table->render();

which outputs:

出力:
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
=============== ========================== ==================

You can also set the style to box:

スタイルをボックスに設定することもできます。
1
2
$table->setStyle('box');
$table->render();

which outputs:

出力:
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  │
└───────────────┴──────────────────────────┴──────────────────┘

You can also set the style to box-double:

スタイルを box-double に設定することもできます。
1
2
$table->setStyle('box-double');
$table->render();

which outputs:

出力:
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  ║
╚═══════════════╧══════════════════════════╧══════════════════╝

If the built-in styles do not fit your need, define your own:

組み込みのスタイルがニーズに合わない場合は、独自のスタイルを定義してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Symfony\Component\Console\Helper\TableStyle;

// by default, this is based on the default style
$tableStyle = new TableStyle();

// customizes the style
$tableStyle
    ->setHorizontalBorderChars('<fg=magenta>|</>')
    ->setVerticalBorderChars('<fg=magenta>-</>')
    ->setDefaultCrossingChar(' ')
;

// uses the custom style for this table
$table->setStyle($tableStyle);

Here is a full list of things you can customize:

カスタマイズできる項目の完全なリストは次のとおりです。

Tip

ヒント

You can also register a style globally:

スタイルをグローバルに登録することもできます:
1
2
3
4
5
// registers the style under the colorful name
Table::setStyleDefinition('colorful', $tableStyle);

// applies the custom style for the given table
$table->setStyle('colorful');

This method can also be used to override a built-in style.

このメソッドは、組み込みスタイルをオーバーライドするためにも使用できます。

In addition to the built-in table styles, you can also apply different styles to each table cell via TableCellStyle:

組み込みのテーブル スタイルに加えて、TableCellStyle を介して各テーブル セルに異なるスタイルを適用することもできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableCellStyle;

$table = new Table($output);

$table->setRows([
    [
        '978-0804169127',
        new TableCell(
            'Divine Comedy',
            [
                'style' => new TableCellStyle([
                    'align' => 'center',
                    'fg' => 'red',
                    'bg' => 'green',

                    // or
                    'cellFormat' => '<info>%s</info>',
                ])
            ]
        )
    ],
]);

$table->render();

Spanning Multiple Columns and Rows

To make a table cell that spans multiple columns you can use a TableCell:

複数の列にまたがるテーブル セルを作成するには、TableCell を使用できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableCell;
use Symfony\Component\Console\Helper\TableSeparator;

$table = new Table($output);
$table
    ->setHeaders(['ISBN', 'Title', 'Author'])
    ->setRows([
        ['99921-58-10-7', 'Divine Comedy', 'Dante Alighieri'],
        new TableSeparator(),
        [new TableCell('This value spans 3 columns.', ['colspan' => 3])],
    ])
;
$table->render();

This results in:

これにより、次の結果が得られます。
1
2
3
4
5
6
7
+---------------+---------------+-----------------+
| ISBN          | Title         | Author          |
+---------------+---------------+-----------------+
| 99921-58-10-7 | Divine Comedy | Dante Alighieri |
+---------------+---------------+-----------------+
| This value spans 3 columns.                     |
+---------------+---------------+-----------------+

Tip

ヒント

You can create a multiple-line page title using a header cell that spans the entire table width:

テーブル幅全体にわたるヘッダー セルを使用して、複数行のページ タイトルを作成できます。
1
2
3
4
5
$table->setHeaders([
    [new TableCell('Main table title', ['colspan' => 3])],
    ['ISBN', 'Title', 'Author'],
]);
// ...

This generates:

これにより、次が生成されます。
1
2
3
4
5
6
7
+-------+-------+--------+
| Main table title       |
+-------+-------+--------+
| ISBN  | Title | Author |
+-------+-------+--------+
| ...                    |
+-------+-------+--------+

In a similar way you can span multiple rows:

同様の方法で、複数の行にまたがることができます:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Helper\TableCell;

$table = new Table($output);
$table
    ->setHeaders(['ISBN', 'Title', 'Author'])
    ->setRows([
        [
            '978-0521567817',
            'De Monarchia',
            new TableCell("Dante Alighieri\nspans multiple rows", ['rowspan' => 2]),
        ],
        ['978-0804169127', 'Divine Comedy'],
    ])
;
$table->render();

This outputs:

これは以下を出力します:
1
2
3
4
5
6
+----------------+---------------+---------------------+
| ISBN           | Title         | Author              |
+----------------+---------------+---------------------+
| 978-0521567817 | De Monarchia  | Dante Alighieri     |
| 978-0804169127 | Divine Comedy | spans multiple rows |
+----------------+---------------+---------------------+

You can use the colspan and rowspan options at the same time, which allows you to create any table layout you may wish.

colspan オプションと rowspan オプションを同時に使用できるため、任意のテーブル レイアウトを作成できます。

Modifying Rendered Tables

The render() method requires passing the entire table contents. However, sometimes that information is not available beforehand because it's generated dynamically. In those cases, use the appendRow() method, which takes the same arguments as the addRow() method, to add rows at the bottom of an already rendered table.

render() メソッドには、テーブルの内容全体を渡す必要があります。ただし、その情報は動的に生成されるため、事前に入手できない場合があります。このような場合は、addRow() メソッドと同じ引数を取る appendRow() メソッドを使用して、レンダリング済みのテーブルの一番下に行を追加します。

The only requirement to append rows is that the table must be rendered inside a Console output section:

行を追加するための唯一の要件は、テーブルが aConsole 出力セクション内でレンダリングされる必要があることです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\Console\Helper\Table;
// ...

class SomeCommand extends Command
{
    public function execute(InputInterface $input, OutputInterface $output): int
    {
        $section = $output->section();
        $table = new Table($section);

        $table->addRow(['Love']);
        $table->render();

        $table->appendRow(['Symfony']);
        
        return Command::SUCCESS;
    }
}

This will display the following table in the terminal:

これにより、ターミナルに次の表が表示されます。
1
2
3
4
+---------+
| Love    |
| Symfony |
+---------+