Новое в Symfony 4.4: Горизонтальные таблицы и списки определений в консольных командах

Компонент Console включает некоторые функции для вывода таблиц и их настройки различными способами. В Symfony 4.4 улучшили его с помощью новых типов таблиц.

Горизонтальные таблицы

Рассмотрим следующий пример:

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)
    {
        $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();
    }
}

Из примера выше отобразиться такая ↓ таблица:

+---------------+--------------------------+------------------+
| 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  |
+---------------+--------------------------+------------------+

Если вы вызываете новый метод setHorizontal(bool $horizontal = true), таблица преобразуется в «горизонтальную таблицу», где данные отображаются в строках, а не в столбцах:

$table
    ->setHeaders(['ISBN', 'Title', 'Author'])
    ->setRows([
        // ... the rows ...
    ])
    ->setHorizontal()
;
+--------+-----------------+----------------------+-----------------------+--------------------------+
| ISBN   | 99921-58-10-7   | 9971-5-0210-0        | 960-425-059-0         | 80-902734-1-6            |
| Title  | Divine Comedy   | A Tale of Two Cities | The Lord of the Rings | And Then There Were None |
| Author | Dante Alighieri | Charles Dickens      | J. R. R. Tolkien      | Agatha Christie          |
+--------+-----------------+----------------------+-----------------------+--------------------------+

При использовании стилей Symfony для команд вы также можете использовать сокращенную запись при помощи метода horizontalTable():

use Symfony\Component\Console\Style\SymfonyStyle;

protected function execute(InputInterface $input, OutputInterface $output)
{
    $io = new SymfonyStyle($input, $output);
    $io->horizontalTable(
        ['ISBN', 'Title', 'Author'],
        [
            // ... the rows ...
        ]
    );
}

Список определений

В Symfony 4.4 также добавили поддержку «списков определений», которые представляют собой набор пар ключ-значение, аналогично HTML <dl>. Списки определений Symfony более гибкие, поскольку они могут включать заголовки, разделители и т. д.

use Symfony\Component\Console\Helper\TableSeparator;

$io->definitionList(
    ['Version' => '4.4.0'],
    ['Long-Term Support' => 'Yes'],
    new TableSeparator(),
    'Timeline',
    ['End of maintenance' => '11/2022'],
    ['End of life' => '11/2023']
);

Этот пример выведет следующую таблицу:

-------------------- ---------
 Version              4.4.0
 Long-Term Support    Yes
-------------------- ---------
 TIMELINE
 End of maintenance   11/2022
 End of life          11/2023
-------------------- ---------