Nuevo en Symfony 4.1: mejoras en la salida de los comandos

El componente Console es el segundo más popular de Symfony, con unos 90 millones de descargas, y está lleno de funcionalidades muy útiles. En Symfony 4.1 hemos añadido una nueva funcionalidad todavía más increíble para poder manejar la salida de los comandos de consola de forma avanzada.

Actualmente, mostrar información en la consola es muy sencillo:

class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Mostrar información...');
 
        // ...
 
        $output->writeln('Mostrar más información...');
    }
}

En Symfony 4.1, además de mostrar información, podrás sobreescribirla, borrarla total o parcialmente, actualizar diferentes partes de la pantalla a la vez y mucho más. Todas estas nuevas funcionalidades se basan en "secciones", que son zonas de la salida de la consola que se manejan independientemente:

class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // por el momento este ejemplo produce el mismos resultado que
        // el ejemplo mostrado anteriormente
        $section = $output->section();
        $section->writeln('Mostrar información en una sección...');
        // ...
    }
}

Sobreescribiendo contenidos

El nuevo método overwrite() borra todos los contenidos actuales de la sección y los reemplaza con los nuevos contenidos:

$section = $output->section();
$section->writeln('Descargando el archivo...');
// ...
$section->overwrite('Descomprimiendo el archivo...');
// ...
$section->overwrite('Copiando los contenidos...');
// ...

Borrando contenidos

El nuevo método clear(int $numeroDeLineas) borra las últimas $numeroDeLineas o todas si no se pasa ningún argumento:

$section = $output->section();
$section->writeln('Bienvenido/a al proceso de instalación');
$section->writeln('Descargando el archivo...');
$section->writeln('Descomprimiendo el archivo...');
$section->writeln('Copiando los contenidos...');
// ...
$section->clear(3);
$section->writeln('La instalación ha finalizado.');

Añadiendo filas a tablas existentes

En las versiones de Symfony anteriores, para mostrar una tabla debías conocer de antemano todos sus contenidos. Gracias al nuevo método appendRow(), que funciona igual que el actual método addRow(), ahora puedes añadir filas a una tabla que ya se ha renderizado en la pantalla:

$section = $output->section();
$table = new Table($section);
 
$table->addRow(['Fila 1']);
// mostrar la tabla solamente con una fila
$table->render();
 
// añadir otra fila a la tabla existente
$table->appendRow(['Fila 2']);

Escribiendo en varias secciones a la vez

Lo mejor de esta nueva funcionalidad es que puedes crear tantas secciones como necesites y puedes escribir/borrar en ellas de manera independiente. El siguiente ejemplo muestra una barra de progreso a medida que se actualiza la tabla y cuando el comando termina, se borra solamente la barra de progreso:

$section1 = $output->section();
$section2 = $output->section();
 
$progress = new ProgressBar($section1);
$progress->start(5);
 
$table = new Table($section2);
$table->addRow(['Fila 1']);
$table->render();
 
foreach ($rowsToProcess as $i => $row) {
    $table->appendRow(['Fila '.$i++]);
    $progress->advance();
    // ...
}
 
$progress->finish();
$section1->clear();

Esta funcionalidad fue contribuida por Pierre du Plessis en el pull request #24363.

Fuente: New in Symfony 4.1: Advanced Console Output

Comentarios

Publicada el

18 de mayo de 2018

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.