Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Symfony Flex: Aliases, Paquetes y Recetas

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

Symfony es un conjunto de librerías que nos proporciona toneladas de herramientas: herramientas para registrar, hacer consultas a la base de datos, enviar correos electrónicos, renderizar plantillas y hacer llamadas a la API, por nombrar algunas. Si las cuentas, como hice yo, Symfony consta de unas 100 bibliotecas distintas. ¡Vaya!

Ahora quiero empezar a convertir nuestras páginas en verdaderas páginas HTML... en lugar de devolver sólo texto. Pero no vamos a meter un montón de HTML en nuestras clases de PHP, qué asco. En su lugar, vamos a renderizar una plantilla.

La filosofía de Symfony de empezar poco a poco e instalar funciones

Pero, ¿adivina qué? ¡No hay ninguna biblioteca de plantillas en nuestro proyecto! ¿Qué? Pero yo creía que acababas de decir que Symfony tiene una herramienta para renderizar plantillas!? ¡Mentira!

Bueno... Symfony sí tiene una herramienta para eso. Pero nuestra aplicación utiliza actualmente muy pocas de las bibliotecas de Symfony. Las herramientas que tenemos hasta ahora no suponen mucho más que un sistema de ruta-controlador-respuesta. Si necesitas renderizar una plantilla o hacer una consulta a la base de datos, no tenemos esas herramientas instaladas en nuestra app... todavía.

De hecho, me encanta esto de Symfony. En lugar de empezar con un proyecto gigantesco, con todo lo que necesitamos, más toneladas de cosas que no necesitamos, Symfony empieza de forma diminuta. Luego, si necesitas algo, lo instalas

Pero antes de instalar una biblioteca de plantillas, en tu terminal, ejecuta

git status

Vamos a confirmar todo:

git add .

Puedo ejecutar con seguridad git add . -que añade todo lo que hay en mi directorio a git- porque uno de los archivos con los que venía nuestro proyecto originalmente era un archivo .gitignore, que ya ignora cosas como el directorio vendor/, el directorio var/ y varias otras rutas. Si te preguntas qué son estas cosas raras de los marcadores, está relacionado con el sistema de recetas, del que vamos a hablar.

En cualquier caso, ejecuta git commit y añade un mensaje:

git commit -m "route -> controller -> response -> profit"

¡Perfecto! Y ahora, estamos limpios.

Instalar una biblioteca de plantillas (Twig)

Bien, ¿cómo podemos instalar una biblioteca de plantillas? ¿Y qué bibliotecas de plantillas están disponibles para Symfony? ¿Y cuál es la recomendada? Bueno, por supuesto, una buena manera de responder a estas preguntas sería consultar la documentación de Symfony.

Pero también podemos simplemente... ¡adivinar! En cualquier proyecto PHP, puedes añadir nuevas bibliotecas de terceros a tu aplicación diciendo "composer require" y luego el nombre del paquete. Todavía no sabemos el nombre del paquete que necesitamos, así que simplemente lo adivinaremos:

composer require templates

Ahora bien, si has utilizado Composer antes, puede que ahora mismo estés gritando a tu pantalla ¿Por qué? Porque en Composer, los nombres de los paquetes son siempre something/something. No es posible, literalmente, tener un paquete llamado simplemente templates.

Pero mira: cuando ejecutamos esto, ¡funciona! Y arriba dice que está usando la versión 1 para symfony/twig-pack. Twig es el nombre del motor de plantillas de Symfony.

Alias de Flex

Para entender esto, vamos a dar un pequeño paso atrás. Nuestro proyecto comenzó con un archivocomposer.json que contiene varias bibliotecas de Symfony. Una de ellas se llamasymfony/flex. Flex es un plugin de Composer. En realidad, añade tres superpoderes a Composer.

Tip

El servidor flex.symfony.com se cerró a favor de un nuevo sistema. ¡Pero aún puede ver una lista de todas las recetas disponibles en ¡ https://bit.ly/flex-recipes!

El primero, que acabamos de ver, se llama aliases de Flex. Dirígete a https://flex.symfony.com para ver una página gigante llena de paquetes. Busca "plantillas". Aquí está. En symfony/twig-pack, dice Aliases: template, templates, twig y twig-pack.

La idea que hay detrás de los alias de Flex es muy sencilla. Escribimoscomposer require templates. Y luego, internamente, Flex lo cambia porsymfony/twig-pack. En última instancia, ése es el paquete que Composer instala.

Esto significa que, la mayoría de las veces, puedes simplemente "composer require" lo que quieras, como composer require logger, composer require orm, composer require icecream, lo que sea. Es sólo un sistema de acceso directo. Lo importante es que, lo que realmente se instaló fue symfony/twig-pack.

Paquetes Flex

Y eso significa que, en nuestro archivo composer.json, deberíamos ver ahorasymfony/twig-pack bajo la clave require. Pero si te das la vuelta, ¡no está ahí! ¡Gracias! En su lugar, ha añadido symfony/twig-bundle, twig/extra-bundle, y twig/twig.

Estamos asistiendo al segundo superpoder de Symfony Flex: desempaquetar paquetes. Copiamos el nombre del paquete original y... podemos encontrar ese repositorio en GitHub entrando en https://github.com/symfony/twig-pack.

Y... sólo contiene un archivo: composer.json. Y esto requiere otros tres paquetes: los tres que acabamos de ver añadidos a nuestro proyecto.

Esto se llama paquete Symfony. Es... realmente un paquete falso que nos ayuda a instalar otros paquetes. Resulta que, si quieres añadir un motor de plantillas rico a tu aplicación, es recomendable instalar estos tres paquetes. Pero en lugar de hacer que los añadas manualmente, puedes hacer que Composer requiera symfony/twig-pack y los obtenga automáticamente. Cuando instalas un "paquete", como éste, Flex lo "desempaqueta" automáticamente: encuentra los tres paquetes de los que depende el paquete y los añade a tu archivo composer.json.

Así pues, los paquetes son un atajo para que puedas ejecutar un comando de composer require y conseguir que se añadan varias bibliotecas a tu proyecto.

Bien, ¿cuál es el tercer y último superpoder de Flex? Me alegro de que lo preguntes Para averiguarlo, en tu terminal, ejecuta

git status

Recetas de Flex

Vaya. Normalmente, cuando ejecutas composer require, los únicos archivos que debería modificar -además de descargar paquetes en vendor/ - son composer.json ycomposer.lock. El tercer superpoder de Flex es su sistema de recetas.

Siempre que instales un paquete, ese paquete puede tener una receta. Si la tiene, además de descargar el paquete en el directorio vendor/, Flex también ejecutará su receta. Las recetas pueden hacer cosas como añadir nuevos archivos o incluso modificar algunos archivos existentes.

Observa: si nos desplazamos un poco hacia arriba, ah sí: dice "configurando 2 recetas". Así que aparentemente había una receta para symfony/twig-bundle y también una receta paratwig/extra-bundle. Y estas recetas aparentemente actualizaron el archivo config/bundles.phpy añadieron un nuevo directorio y archivo.

El sistema de recetas es genial. Todo lo que tenemos que hacer es que Composer requiera una nueva biblioteca y su receta añadirá todos los archivos de configuración u otra configuración necesaria para que podamos empezar a usar esa biblioteca inmediatamente Se acabó el seguir 5 pasos de "instalación" manual en un README. Cuando añades una biblioteca, funciona de forma inmediata.

A continuación: Quiero profundizar un poco más en las recetas. Por ejemplo, ¿dónde viven? ¿Cuál es su color favorito? ¿Y qué ha añadido esta receta específicamente a nuestra aplicación y por qué? También voy a contarte un pequeño secreto: todos los archivos de nuestro proyecto -todos los archivos de config/, el directorio public/... todas estas cosas- se añadieron mediante una receta. Y lo demostraré.

Leave a comment!

9
Login or Register to join the conversation
Nick-F Avatar

Where's the best place to browse flex packages now that the flex.symfony.com page is gone?

Reply

Hey Nick F.!

The best place, at this moment, is to browser the GitHub repositories themselves - https://github.com/symfony/... and https://github.com/symfony/....

However, I'm going to build something that will expose some of the information that was previously on flex.symfony.com onto the README of those repositories (and then redirect flex.symfony.com to that). What exactly do you want to use this information for? You mentioned "browse flex packages": were you using flex.symfony.com as way to see a total list of all packages available? Or just to see what flex aliases were available for the most important packages? Something else?

Cheers!

Reply

Hey again weaverryan!

flex.symfony.com is now down forever (it will remain that way so that it's super clear to people with outdated version of symfony/flex why things are broken for them), but we have created a quick little README showing the flex packages and aliases: https://github.com/symfony/...

Cheers!

Reply
Will H. Avatar

Symfony 6 new project, just installed as of Aprli 15 '22

When I tried


$ compose require symfony/flex

I've got

Error: no "compose" mailcap rules found for type "cannot open `require' (No such file or directory)"
Error: no write permission for file "symfony/flex"

After a lot of mixed signals in several websites I guessed it is because symfony/flex went serverless (whatever that means)

Finally what worked for me was:

$ composer require symfony/twig-pack
Reply

Hey Memovil,

Yes, the command name should be "composer" not "compose", so the full command name should be "composer require symfony/flex". I suppose you just misprinted the command name, but in case you copy/pasted it from somewhere - let me know and I'll double check and fix it.

Cheers!

Reply
Will H. Avatar

oh sorry I mixed up the copy/paste with a typo I made.

Somehow using

composer require templates was giving me some weird error. (sorry lost that screen)

I had to require symfony/twig-pack" instead of the "templates" alias.

After that it worked.

Still can't figure why. Tried to replicate in a new instance of symfony and worked like a charm.

Reply

Hey Memovil,

Well, "templates" is the official Flex alias for the symfony/twig-pack package, you can see it here: https://github.com/symfony/... . So, the only reason I may think of - most probably you don't have a Flex installed, make sure you have symfony/flex depepndency. Or... you may use an old version of Flex, please, upgrade it to the latest and try again.

Cheers!

Reply
Benoit-L Avatar
Benoit-L Avatar Benoit-L | posted hace 9 meses

Hello,
I've got the following message when I run composer update symfony/flex --no-plugins --no-scripts : Your requirements could not be resolved to an installable set of packages.

when trying composer update, I've got the following error : Your requirements could not be resolved to an installable set of packages.

Problem 1
- Root composer.json requires composer-runtime-api 2.1, found composer-runtime-api[2.0.0] but it does not match the constraint.
Problem 2
- Root composer.json requires symfony/flex 2.1.7 -> satisfiable by symfony/flex[v2.1.7].
- symfony/flex v2.1.7 requires composer-plugin-api ^2.1 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 3
- symfony/framework-bundle[v6.0.0, ..., v6.0.7] require composer-runtime-api >=2.1 -> found composer-runtime-api[2.0.0] but it does not match the constraint.
- Root composer.json requires symfony/framework-bundle 6.0.* -> satisfiable by symfony/framework-bundle[v6.0.0, ..., v6.0.7].

You are using Composer 2, which some of your plugins seem to be incompatible with. Make sure you update your plugins or report a plugin-issue to ask them to support Composer 2. I am using php 8.

Should I update the version of composer ?

Well, that's what I did and it works now.

Reply

Hey Benoit,

OK, so Composer upgrade worked for you, great! Thanks for sharing the final solution with others.

Btw, we're not talking about upgrade in this tutorial, if you're interesting in Symfony 6 upgrade tutorial - take a look at: https://symfonycasts.com/sc... - we will start releasing it very soon.

Cheers!

Reply
Cat in space

"Houston: no signs of life"
Start the conversation!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": ">=8.0.2",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "symfony/asset": "6.0.*", // v6.0.3
        "symfony/console": "6.0.*", // v6.0.3
        "symfony/dotenv": "6.0.*", // v6.0.3
        "symfony/flex": "^2", // v2.1.5
        "symfony/framework-bundle": "6.0.*", // v6.0.4
        "symfony/monolog-bundle": "^3.0", // v3.7.1
        "symfony/runtime": "6.0.*", // v6.0.3
        "symfony/twig-bundle": "6.0.*", // v6.0.3
        "symfony/ux-turbo": "^2.0", // v2.0.1
        "symfony/webpack-encore-bundle": "^1.13", // v1.13.2
        "symfony/yaml": "6.0.*", // v6.0.3
        "twig/extra-bundle": "^2.12|^3.0", // v3.3.8
        "twig/twig": "^2.12|^3.0" // v3.3.8
    },
    "require-dev": {
        "symfony/debug-bundle": "6.0.*", // v6.0.3
        "symfony/stopwatch": "6.0.*", // v6.0.3
        "symfony/web-profiler-bundle": "6.0.*" // v6.0.3
    }
}