04.

Recetas Flex Mágicas

|

Share this awesome video!

|

Tengo un secreto. Cuando se creó nuestro proyecto, no eran 15 archivos. Era... un solo archivo. Si miraras dentro del código del comando symfony new, descubrirías que es un atajo para sólo dos cosas. Primero, clona un repositorio llamado symfony/skeleton... que es sólo un archivo si ignoras la licencia. Y en segundo lugar, ejecuta composer install.

Y ya está Pero espera, si ese es el caso, ¿de dónde han salido todos esos otros archivos? ¿Como las cosas de bin/, config/ y src/? La respuesta empieza con un paquete especial dentro de nuestro archivo composer.json llamadosymfony/flex. Flex es un complemento de Composer que añade dos superpoderes a Composer: alias y recetas.

72 lines | composer.json
{
// ... lines 2 - 5
"require": {
// ... lines 7 - 11
"symfony/flex": "^2",
// ... lines 13 - 15
},
// ... lines 17 - 70
}

Alias Flex

Los alias son sencillos. Para añadir un nuevo paquete a tu aplicación -lo que haremos en un minuto- ejecutas composer require y luego el nombre del paquete, como symfony/http-client. Flex da a los paquetes más importantes del ecosistema Symfony un nombre más corto, llamado alias. Por ejemplo, symfony/http-client tiene un alias llamadohttp-client. Sí, podríamos ejecutar composer require http-client y Flex lo traduciría al nombre final del paquete. Es sólo un atajo a la hora de añadir paquetes.

Si quieres ver todos los alias disponibles, ve a un repositorio llamado symfony/recetas... y luego haz clic en el enlace a RECIPES.md. A la derecha, ¡ahí están!

El sistema de recetas

El segundo superpoder que Symfony Flex añade a Composer son las recetas. Son fascinantes. Cuando añades un nuevo paquete, puede tener una receta, que es básicamente un conjunto de archivos que se añadirán a tu proyecto. Y resulta que todos los archivos con los que empezamos -en bin/, config/, public/ - proceden de las recetas de los paquetes que se instalaron originalmente.

Por ejemplo, symfony/framework-bundle es el paquete "core" del Framework Symfony. Puedes comprobar su receta yendo al repositorio symfony/recipes y navegando a symfony, framework-bundle, y luego a la última versión. Echa un vistazo a config/packages/: ¡la mayoría de las cosas con las que empezamos proceden de esta receta!

Otra forma de ver las recetas es en tu línea de comandos. Ejecuta:

composer recipes

Aparentemente se instalaron las recetas de cuatro paquetes diferentes. Y podíamos obtener información sobre cualquiera de ellos añadiendo su nombre al final del comando.

De todos modos, las recetas son increíbles porque podemos instalar un paquete y obtener al instante cualquier archivo que necesitemos. En lugar de complicarnos con la configuración, nos ponemos manos a la obra.

Instalar PHP CS Fixer

Vamos a probar esto: añadamos un nuevo paquete llamado PHP-CS-Fixer que nos proporcionará un archivo ejecutable para arreglar el estilo de nuestro código. Por ejemplo, ensrc/Controller/MainController.php, si sigues las normas de codificación de PHP, la llave debe estar en la línea siguiente a una función. Si hiciéramos algo así, nuestro archivo violaría ahora esas normas. Eso no dañaría nada, pero ya sabes, queremos que nuestro código tenga un aspecto limpio. Y PHP-CS-Fixer puede ayudarnos a hacerlo.

Para instalarlo, ejecuta:

composer require cs-fixer-shim

Y sí, se trata de un alias. Encima, el paquete verdadero es php-cs-fixer/shim.

¿Este paquete venía con una receta? ¡Pues sí! El Configuring php-cs-fixer/shimnos lo indica. Pero, también podemos verlo ejecutando:

git status

El hecho de que composer.json y composer.lock estén modificados es un comportamiento 100% normal de Composer. Puedes ver que composer.json tiene la nueva biblioteca bajo la clave require.

71 lines | composer.json
{
// ... lines 2 - 5
"require": {
// ... lines 7 - 9
"php-cs-fixer/shim": "^3.46",
// ... lines 11 - 16
},
// ... lines 18 - 69
}

Pero todos los demás archivos modificados o nuevos lo son gracias a la receta del paquete.

Investigando la receta

¡Vamos a investigar esto! Abre .gitignore. ¡Genial! En la parte inferior, ha añadido dos nuevas entradas para dos archivos comunes que querrás ignorar cuando utilices PHP CS fixer.

16 lines | .gitignore
// ... lines 1 - 11
###> php-cs-fixer/shim ###
/.php-cs-fixer.php
/.php-cs-fixer.cache
###

La receta también añadió un nuevo archivo .php-cs-fixer.dist.php. Este es el archivo de configuración de CS Fixer. ¡Y compruébalo!

$finder = (new PhpCsFixer\Finder())
->in(__DIR__)
->exclude('var')
;
return (new PhpCsFixer\Config())
->setRules([
'@Symfony' => true,
])
->setFinder($finder)
;

Está prediseñado para funcionar con nuestra aplicación Symfony. Le dice que arregle todos los archivos del directorio actual, pero que ignore el directorio var/ porque es donde Symfony almacena sus archivos de caché. También le dice que utilice un conjunto de reglas llamado Symfony. Eso significa que queremos que el estilo de nuestro código coincida con el estilo de Symfony. La cuestión es en lugar de perder el tiempo buscando esta configuración por defecto... ¡simplemente la cogemos!

El último archivo modificado es symfony.lock. Esto mantiene un registro de qué recetas tenemos instaladas y en qué versión. Y sí, vamos a enviar todos estos archivos a nuestro repositorio.

Utilizar PHP-CS-Fixer

Ahora que hemos instalado el paquete, vamos a utilizarlo. Para ello, ejecuta:

./vendor/bin/php-cs-fixer

Eso mostrará todos los comandos disponibles. El que queremos se llama fix. Pruébalo:

./vendor/bin/php-cs-fixer fix

Y... ¡sí! ¡Ha encontrado la infracción en MainController.php! Cuando vamos a ese archivo... ¡sí! Movió mi llave rizada desde el final de la línea hasta la línea siguiente. Es fantástico.

A continuación, vamos a conocer e instalar una de mis bibliotecas favoritas de todo PHP: el motor de plantillas Twig.