Помощник Formatter

Дата обновления перевода 2024-06-24

Помощник Formatter

Помощник Formatter предоставляет функции для форматирования вывода цветами. Вы можете сделать более продвинутые вещи с помощью этого помощника, чем вы можете сделать в Как раскрашивать и стилизовать вывод консоли.

FormatterHelper включён в набор помощника по умолчанию, который вы можете получить, вызвав getHelperSet():

1
$formatter = $this->getHelper('formatter');

Методы возвращают строку, которую вы обычно будете отображать консоли, передавая её методу OutputInterface::writeln.

Note

В качестве альтернативы можно использовать SymfonyStyle для отображения стилизованных блоков.

Отображение сообщений в разделе

Symfony предоставляет определённый стиль при отображении сообщения, принадлежащего некоторому "разделу". Он отображает раздел в цвете и со скобками вокруг него, а само сообщение правее от этого. Без учёта цвета, это выглядит так:

1
[SomeSection] Здесь какое-то сообщение, связанное с разделом

Чтобы воспроизвести этот стиль, вы можете использовать метод formatSection():

1
2
3
4
5
$formattedLine = $formatter->formatSection(
    'SomeSection',
    'Here is some message related to that section'
);
$output->writeln($formattedLine);

Отображение сообщений в блоке

Иногда вам может захотеться отобразить целый блок текста с фоновым цветом. Symfony использует это при отображении сообщений об ошибках.

Если вы отображаете ваши сообщения об ошибках более, чем в одной строчке, вручную то вы заметите, что фон имеет длину кажой отдельной строки. Используйте formatBlock(), чтобы сгенерировать вывод блока:

1
2
3
$errorMessages = array('Error!', 'Something went wrong');
$formattedBlock = $formatter->formatBlock($errorMessages, 'error');
$output->writeln($formattedBlock);

Как вы видите, передача массива сообщений методу formatBlock() созадаёт желаемый вывод. Если вы передадите true в качестве третьего параметра, то блок будет форматирован с большей подкладкой (одной пустой строчкой над и под собщениями и 2 пробелами слева и справа).

Конкретный "стиль", который вы используете в блоке, зависит только от вас. В этом случае, вы используете предопределённый стиль error, но существуют другие, или вы можете создать собственный. См. Как раскрашивать и стилизовать вывод консоли.

Отображение обрезанных сообщений

Иногда вам нужно будет отобразить сообщение, обрезанное до точного количества символов. Это возможно с методом truncate().

Если вы хотите обрезать очень длинное сообщение, к примеру, до 7 символов, вы можете написать:

1
2
3
$message = "Это очень длинное сообщние, которое стоит обрезать";
$truncatedMessage = $formatter->truncate($message, 7);
$output->writeln($truncatedMessage);

И вывод будет:

1
Это оче...

Сообщение обрезается до заданной длинны, а потом к концу этой строки добавляется суффикс.

Отрицательная длина строки

Если длина отрицательная, то количество символов для обрезания считается от конца строки:

1
$truncatedMessage = $formatter->truncate($message, -5);

Это приведёт к :

1
Это очень длинное сообщение, которое стоит обр...

Пользовательский суффикс

По умолчанию используется суффикс .... Если вы хотите использовать другой, просто передайте его в качестве третьго аргумента метода. Суффикс всегда добавляется, кроме случаев, когда длина обрезания больше длины сообщения и суффикса. Если вы не хотите использовать суффикс вообще, просто передайте пустую строку:

1
2
3
4
5
6
$truncatedMessage = $formatter->truncate($message, 7, '!!'); // result: This is!!
$truncatedMessage = $formatter->truncate($message, 7, '');   // result: This is

$truncatedMessage = $formatter->truncate('test', 10);
// result: test
// так как длина строки "test..." короче, чем 10 10

Форматирование времени

Иногда требуется отформатировать секунды по времени. Это возможно с помощью метода formatTime(). Первый аргумент - это секунды для форматирования, а второй аргумент - точность результата (по умолчанию 1):

1
2
3
4
Helper::formatTime(42);        // 42 секунд
Helper::formatTime(125);       // 2 минут
Helper::formatTime(125, 2);    // 2 минуты, 5 секунд
Helper::formatTime(172799, 4); // 1 день, 23 часа, 59 минут, 59 секунд

Форматирование памяти

Иногда вам бывает нужно отформатировать память в Гб, Мб, Кб и Б. Это можно сделать с помощью метода formatMemory(). Единственным аргументом является размер памяти для форматирования:

1
2
3
4
Helper::formatMemory(512);                // 512 Б
Helper::formatMemory(1024);               // 1 Кб
Helper::formatMemory(1024 * 1024);        // 1.0 Мб
Helper::formatMemory(1024 * 1024 * 1024); // 1 Гб