Symfony 4: Automatización
Symfony 4 se publicará en Noviembre de 2017. Esta serie de artículos explica sus principales novedades:
- Symfony 4 (parte 1): Componer en vez de heredar
- Symfony 4 (parte 2): Microaplicaciones y monolitos
- Symfony 4 (parte 3): Buenas Prácticas
- Symfony 4 (parte 4): Estructura de directorios
- Symfony 4 (parte 5): Automatización
- Symfony 4 (parte 6): Un ejemplo práctico
- Symfony 4 (parte 7) (se publicará próximamente)
- Symfony 4 (parte 8) (se publicará próximamente)
La característica más innovadora de Symfony 4 es la nueva forma de gestionar el día a día de tus aplicaciones. Se acabó perder el tiempo copiando y pengando desde archivos README. Olvídate de todas las tareas aburridas al trabajar en una aplicación Symfony. Todo esto se ha acabado gracias a la automatización y a una cuidadosa selección que haremos de los mejores paquetes de Composer.
Symfony Flex
Symfony 4 funciona gracias a Symfony Flex, un plugin de Composer que es sencillo
pero muy poderoso. La estructura por defecto de las aplicaciones Symfony
solamente tiene dos dependencias: symfony/flex
y symfony/framework-bundle
.
Todo lo demás es opcional.
Obviamente cualquier proyecto real necesita más cosas aparte del
FrameworkBundle
. Pero instalar esas dependencias a mano es aburridísimo y es
fácil cometer errores. Gestionar las dependencias de los proyectos Symfony es
precisamente el punto fuerte de Symfony Flex.
Cuando instalas un paquete con Composer, Flex "se mete en medio" del proceso de instalación para integrarlo automáticamente en tu aplicación. Esta integración se realiza mediante una serie de instrucciones, llamadas recipes o recetas, que ya han sido definidas por la propia comunidad.
Symfony Flex funciona para cualquier paquete de Composer, no solo para los bundles de Symfony. Si el paquete no tiene una receta, Flex no hace nada y el paquete se instala exactamente igual que hasta ahora. Lógicamente, después tienes que configurarlo a mano, ya que Flex no puede ayudarte en ese caso.
El paquete sensiolabs/security-checker
por ejemplo se puede instalar en
cualquier proyecto PHP para comprobar los problemas de seguridad de tus
dependencias. La diferencia es que si lo instalas con Symfony Flex, a partir de
entonces tu proyecto Symfony lo utilizará automáticamente cada vez que ejecutes
composer install
.
Esta automatización se define en una receta que no es más que un archivo
JSON que describe cómo integrar el paquete en una aplicación Symfony. Este es
por ejemplo el contenido de ese archivo JSON para el paquete
sensiolabs/security-checker
:
{ "copy-from-recipe": { "config/": "%CONFIG_DIR%/" }, "composer-scripts": { "vendor/bin/security-checker security:check": "php-script" } }
Symfony Flex define nueve tipos de configurators o configuradores para
definir cómo un paquete PHP se integra en una aplicación Symfony:
copy-from-recipe
, copy-from-package
, bundles
, env
, container
,
makefile
, composer-scripts
, gitignore
y post-install-output
.
Bundles
El configurador bundles
sirve para activar bundles en la aplicación
añadiéndolos en el nuevo archivo bundles.php
(y los quita cuando desinstalas
la dependencia):
{ "bundles": { "Symfony\\Bundle\\DebugBundle\\DebugBundle": ["dev", "test"], "Symfony\\Bundle\\MonologBundle\\MonologBundle": ["all"] } }
Configuración
La configuración se define con los configuradores copy-from-recipe
y
copy- from-package
: el primero copia archivos o directorios desde la propia
receta del paquete y el segundo copia archivos o directorios desde el paquete
mismo.
{ "copy-from-package": { "bin/check.php": "%BIN_DIR%/check.php" }, "copy-from-recipe": { "config/": "%CONFIG_DIR%/", "src/": "%SRC_DIR%/" } }
Variables de entorno
El configurador env
sirve para añadir variables de entorno a los archivos
.env
y .env.dist
del proyecto (y como antes, las borra automáticamente
cuando desinstalas la dependencia):
{ "env": { "APP_ENV": "dev", "APP_DEBUG": "1" } }
Tareas del Makefile
Sirve para añadir nuevas tareas en el archivo Makefile
principal del proyecto
(y borrarlas cuando desinstales la dependencia):
{ "makefile": [ "serve:", "\t@echo \"\\033[32;49mServer listening on http://127.0.0.1:8000\\033[39m\"", "\t@echo \"Quit the server with CTRL-C.\"", "\t@echo \"Run \\033[32mcomposer require symfony/web-server-bundle\\033[39m for a better web server\"", "\tphp -S 127.0.0.1:8000 -t public", ".PHONY: serve" ] }
Scripts de Composer
El archivo composer.json
por defecto de las aplicaciones Symfony (que se define
como parte del paquete symfony/skeleton
) contiene lo siguiente:
{ "scripts": { "auto-scripts": [ ], "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" ] } }
El configurador composer-scripts
sirve para añadir comandos y scripts en la
sección @auto-scripts
que se ejecutan cada vez que ejecutes composer install
o composer update
:
{ "composer-scripts": { "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd" } }
.gitignore
Sirve para añadir nuevas reglas en el archivo .gitignore
principal del proyecto.
Como sucede con el resto de configuradores, cuando desinstalas el paquete, las
reglas que añadió en .gitignore
se borran:
{ "gitignore": [ "/phpunit.xml" ] }
Mostrando información
El configurador post-install-output
sirve para mostrar información útil en la
consola. Soporta los mismos estilos y formatos que los comandos de Symfony:
{ "post-install-output": [ "Execute <fg=blue>make serve</> to run your application." ] }
Ejemplo completo
El archivo JSON más complejo que hemos definido por ahora es precisamente el del
paquete symfony/framework-bundle
. Copiamos a continuación su contenido para
que te hagas una mejor idea de cómo funciona Symfony Flex:
{ "bundles": { "Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle": ["all"] }, "copy-from-recipe": { "config/": "%CONFIG_DIR%/", "src/": "%SRC_DIR%/", "public/": "%PUBLIC_DIR%/" }, "composer-scripts": { "make cache-warmup": "script", "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd" }, "env": { "APP_ENV": "dev", "APP_DEBUG": "1", "APP_SECRET": "%generate(secret)%" }, "makefile": [ "cache-clear:", "\t@test -f bin/console && bin/console cache:clear --no-warmup || rm -rf var/cache/*", ".PHONY: cache-clear", "", "cache-warmup: cache-clear", "\t@test -f bin/console && bin/console cache:warmup || echo \"cannot warmup the cache (needs symfony/console)\"", ".PHONY: cache-warmup", "", "serve:", "\t@echo \"\\033[32;49mServer listening on http://127.0.0.1:8000\\033[39m\"", "\t@echo \"Quit the server with CTRL-C.\"", "\t@echo \"Run \\033[32mcomposer require symfony/web-server-bundle\\033[39m for a better web server\"", "\tphp -S 127.0.0.1:8000 -t public", ".PHONY: serve" ], "gitignore": [ ".env", "/var/", "/vendor/", "/public/bundles/" ], "post-install-output": [ "<bg=blue;fg=white> </>", "<bg=blue;fg=white> What's next? </>", "<bg=blue;fg=white> </>", "", " * <fg=blue>Run</> your application:", " 1. Execute the <comment>make serve</comment> command;", " 2. Browse to the <comment>http://localhost:8000/</comment> URL.", "", " * <fg=blue>Read</> the documentation at <comment>https://symfony.com/doc</comment>" ] }
¡Y eso es todo! Estos nueve configuradores permiten integrar cualquier paquete PHP en las aplicaciones Symfony, sin importar lo complejos que sean tus requerimientos.
Un repositorio selecto
El repositorio oficial de recetas de Symfony Flex será restringido y supervisado para garantizar su calidad. En tus aplicaciones eres libre de usar los paquetes que quieras, pero desde el proyecto Symfony elegiremos algunos paquetes "oficiales". No vamos a sopotar todos los bundles, solo una cuidada selección de los mejores.
No tengas miedo. Symfony no te va a obligar a instalar ningún paquete concreto. Seguirás teniendo plena libertad para instalar lo que quieras. Pero como tenemos más de 3.000 bundles, muchos de ellos semiabandonados, no es nada fácil escoger un bundle si eres un principiante de Symfony.
Por ejemplo, ¿quieres un "admin generator" en tu aplicación? Pues existen por lo menos 26 paquetes de ese tipo. Algunos de ellos son muy populares. ¿Cuál deberíamos elegir? En Symfony 1 no teníamos este problema porque el "admin generator" ya venía incluido en el propio Symfony. Pero esto es solo un ejemplo. El verdadero problema es que hay decenas de paquetes para hacer un blog, decenas para crear APIs, etc. Lo único bueno de todo esto es que parece que la comunidad Symfony está trabajando realmente duro para crear paquetes.
En los últimos años, Symfony se ha ido convirtiendo más y más en un framework de "bajo nivel", entendido como un framework que no proporciona funcionalidades completas ya hechas, como por ejemplo un gestor de CMS, un admin generator, etc. Ahora que gracias a Symfony Flex tenemos una plataforma lista para automatizar todo, ha llegado el momento de volver a tomar decisiones y recomendar algunos de esos paquetes que ofrecen funcionalidades completas.
También queremos dar más visibilidad a los bundles buenos. Lo primero, claro está, será definir qué significa exactamente ser un bundle bueno. Podríamos por ejemplo definir una serie de requisitos comprobables objetivamente: que use una licencia libre, el número de bugs abiertos, la actividad de desarrollo, cuánta documentación tiene, el número de personas que contribuyen al proyecto, si es compatible con varias versiones de Symfony, etc.
En cualquier caso, recuerda que tendrás plena libertad como hasta ahora de instalar cualquier paquete o bundle en tus proyectos. Y por supuesto, puedes seguir instalando cualquier bundle sin usar Symfony Flex, si es eso lo que quieres.
El servidor de Symfony Flex
Además de ser un plugin de Composer, Symfony Flex también se comunica con un servidor HTTP para obtener información actualizada sobre las recetas de los paquetes, los "alias" definidos para los paquetes, etc.
Si quieres probarlo ya mismo, ejecuta lo siguiente para ver un ejemplo de la información que proporciona este servidor:
$ curl https://flex.symfony.com/recipes/sensiolabs/security-checker/4.0 | json_pp
¿Quieres probar Symfony Flex en tus propias aplicaciones? Ya no tendrás que esperar mucho. Si todo va bien, publicaremos Symfony Flex antes de publicar el siguiente artículo.
Este artículo es una traducción del artículo Symfony 4: Automate your Workflow publicado por Fabien Potencier.
Comentarios
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.