Symfony 4: Automatización

Symfony 4 se publicará en Noviembre de 2017. Esta serie de artículos explica sus principales novedades:


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

Publicada el

13 de abril de 2017

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.