Creando aplicaciones de Symfony a través de sus componentes: Console

Pablo Lozano Munárriz
The Cocktail Engineering
3 min readMay 21, 2019

--

En esta serie de artículos vamos a crear una aplicación Symfony intentando comprender el funcionamiento de cada uno de los componentes que vamos a ir usando.

Estamos acostumbrados, gracias a la facilidad de configuración del framework, a crear aplicaciones mediante archivos de configuración pero quizá no sepamos cómo funciona internamente cada uno de esos componentes. Para ello iremos añadiendo componentes uno a uno para ir viendo cómo trabaja internamente Symfony.

La funcionalidad que nos piden desarrollar se basa en una aplicación que lea archivos de un directorio y realice una serie de acciones según el tipo de archivo.

Como en principio no es una aplicación Web al uso no necesitaremos todo el framework por lo que de momento instalaremos el componente Console.

Iniciamos la aplicación con composer e instalamos el componente.

composer init --no-interaction 
composer require symfony/console

A continuación creamos un archivo php ejecutable donde empezaremos a desarrollar nuestra aplicación.

Como vemos la aplicación no hace absolutamente nada, necesitamos definir una serie de comandos y añadirlos a la aplicación para que podamos empezar a trabajar con los archivos a procesar.

Y lo añadimos a la aplicación:

Antes de lanzar el comando debemos registrar el namespace de nuestra app en composer, para ello añadimos a composer.json:

"autoload": {
"psr-4": {
"App\\": "src"
}
},

Al lanzar la aplicación veremos que tenemos el mismo resultado y que tenemos que añadir el parámetro processor_command que es el nombre de nuestro comando para que se ejecute.

Como nuestra aplicación solo va a tener un comando de entrada podemos registrar este comando por defecto.

$app->setDefaultCommand($command->getName());

Una vez llegado aquí necesitamos especificar el directorio donde se encontrarán los archivos a procesar, por lo que hemos de definir argumentos u opciones para el mismo:

Como vemos hemos definido un argumento y una opción. Este último permite definir una abreviatura para el mismo.

./command.php process /tmp/files -e="pdf"

¿Y si queremos procesar varios directorios? Para ello tan solo cambiamos el tipo de argumento a InputArgument::IS_ARRAY

Ejecutando el comando de la siguiente forma:

./command.php process -extension=pdf /tmp/files /var/www/upload

Añadiendo formatos y estilos

El componente console nos permite mostrar el progreso de nuestra aplicación mediante comandos de salida o barras de progreso.

Se pueden aplicar estilos personalizados a estos mensajes así como personalizar la barra de progreso de nuestra aplicación.

Siguiente paso… Dependency Injection

Como vemos nuestra aplicación no hace absolutamente nada. Debemos separar la lógica de la aplicación en servicios que nos ayudarán a tener mejor organizado nuestro código aparte de poder reutilizar los mismos para otros métodos de entrada que no sea la consola.

Para ello usaremos el componente Dependency Injection que nos ayudará a registrar estos servicios y avanzar de forma rápida en el desarrollo.

--

--