Blog de Gonzalo

CREAR COMANDOS PERSONALIZADOS EN SYMFONY 5

El componente Console de symfony permite la creación de interfaces de línea de comandos para después emplearse en tareas como cronjobs, importaciones, etc...En este post voy a explicar como crear comandos personalizados en symfony 5:
Lo primero es crear una clase en la carpeta Command, dentro de src. El nombre de la clase será: NombreComandoCommand que extenderá de la clase Command de symfony. Dicha clase tendrá, como mínimo, dos métodos: método configure y el método execute, este último tiene que ser de tipo public. Voy a poner un ejemplo de un comando para que se vea mejor su funcionamiento, en este caso del comando SaludoCommand.php:


namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class SaludoCommand extends Command
{
    //Nombre del comando para su ejecución desde consola
    protected static $defaultName = 'app:saludo';

    protected function configure()
    {
      //Se configura el comando. Lo más importante es addArgument. Aunque los comandos pueden no tener argumentos o parámetos
      $this
       ->setDescription('Muestra un saludo a un nombre pasado por parámetro')
       ->setHelp('Este comando saluda.')
       ->addArgument('name', InputArgument::REQUIRED, 'Pass the name.');
    }

    public function execute(InputInterface $input, OutputInterface $output): int
    {
      //Se captura el parámetro o argumento pasado por consola
      $name = $input->getArgument('name');
      if (empty($name)) {
            throw new \Exception('Missing parameter name');
            return Command::FAILURE;
      }
      $output->writeln('Hola ' . $name );
      return Command::SUCCESS;
    }
}

Para ejecutar el comando del ejemplo hay que ir a la consola y a la carpeta del proyecto y escribir php bin/console app:saludo parametro_nombre y mostrará el saludo al nombre especificado.