El día 31 de mayo de 2021 se publicó la versión 5.3.0 del framework Symfony y sucede habitualmente en su ecosistema aparecen componentes, mejoras o herramientas que nos permiten enfocar nuevos desarrollos desde nuevos ángulos. Desde el equipo de backend de acceseo opinamos que, estamos ante una de esas versiones que incluye tanto cambios con mucho peso que serán explotados a medio plazo, como una serie de pequeñas mejoras que nos hacen el día a día mucho más cómodo (desde el el primer día de vida de la rama 5.3).
A continuación repasaremos las novedades que más nos han gustado, que más interesantes nos parecen y que se han ido publicando durante las últimas semanas en el blog oficial de Symfony.
Negatable command options
Tabla de contenidos
ToggleEmpezamos por una de esas pequeñas mejoras que nos facilitan el día a día. Con las opciones de comando negables se añade la nueva constante InputOption::VALUE_NEGATABLE, que nos permite añadir de forma automática la opción con el nombre definido y su versión negada prefijada por no-. Con este comportamiento dependiendo del flag que utilicemos en el terminal al ejecutar el comando, nos devolverá true para la versión estándar o false si lanzamos el comando con la versión negada al llamar al método getOption.
Tailwind CSS form theme
Tailwind ha ganado una tracción tremenda en los últimos tiempos convirtiéndose probablemente en el framework CSS utility-first más utilizado y conocido. En esta release Symfony pasa a incluir un tema de los formularios que integra Tailwind, sumándose a las opciones ya existentes basadas en Bootstrap, Foundation o los temas de base que nos permiten de manera fácil integrar nuestra propia estructura y estilos.
Este nuevo tema está basado en Tailwind 2 y el plugin oficial de formularios, añadiendo las clases mínimas para que el funcionamiento sea adecuado. Pero si lo prefieres puedes extender el tema añadiendo las clases que consideres a los elementos como base, de esta forma no tendrás que especificarlas por ejemplo, cada vez que añades un campo en un formulario desde Twig. Los mecanismos de extensión y registro de temas de formularios son los habituales, en ese sentido la única novedad es la existencia de un tema de formularios específico basado en Tailwind.
PasswordHasher component
Hasta la versión 5.3 Symfony hacía referencia al concepto de password encoding cuando realmente lo adecuado sería utilizar password hashing, porque es justamente la tarea que se lleva a cabo. Para solucionar esto, se ha creado un nuevo componente llamado PasswordHasher que agrupa las funcionalidades que antes estaban bajo el paraguas del mal llamado password encoding, y se han renombrado todos los elementos del ecosistema relacionados con este punto, como por ejemplo las directivas de configuración de seguridad o los comandos de utilidades relacionadas con la funcionalidad.
Es importante tener en cuenta también que todas las clases de encoding han sido marcadas como deprecated, y en la versión 6.0 desaparecerán por lo que deberíamos empezar a utilizar el nuevo componente cuanto antes.
Form handler helper
Si alguna parte de Symfony no nos acababa de parecer redonda es el desarrollo de front, y con la nueva iniciativa Symfony UX parece que esto ha cambiado y se están introduciendo mejoras a buen ritmo. En esta ocasión se suma el método AbstractController::renderForm al ya conocido AbstractController::render, con este nuevo método se pretende que se realice un uso adecuado de los códigos de respuesta HTTP, para facilitar la integración de herramientas como Turbo que siguen el protocolo de manera estricta.
Seguridad, usuarios y contraseñas
Hay varios cambios en este sentido, y es que Symfony sigue avanzando en una dirección clara, desacoplar al usuario de los conceptos clásicos de nombre de usuario y contraseña, en favor de utilizar el término identificador; y desacoplar la autenticación del propio usuario, para evitar incorporar de base todo lo necesario para tratar contraseñas cuando nuestra aplicación utiliza login mediante enlaces por ejemplo.
Novedades en comandos de debug
Si utilizas Symfony como tu herramienta de trabajo, lo más probable es que hayas utilizado alguno de sus comandos de debug, por ejemplo bin/console debug:container. A la lista de comandos de debug actual se añade el comando debug:firewall, además de la opción –dispatcher para el comando debug:event-dispatcher; que ha sido añadida a raíz de los recientes cambios en la gestión de los eventos por parte del firewall.
Siguiendo la trayectoria que aleja cada vez más a Symfony del uso de cadenas para referenciar eventos, ahora la búsqueda de debug:event-dispatcher permitirá filtrar utilizando partes del nombre de la clase para evitar tener que escribir todo el FQCN.
Configuración de múltiples entornos en el mismo archivo
Otro de esos pequeños cambios que nos trae esta versión, que funcionarán muy bien en las aplicaciones pequeñas o medianas, se centra en evitar que tengamos que crear varios ficheros de configuración para varios entornos cuando los cambios son realmente pequeños entre entornos. En el fichero de configuración principal podremos definir condicionales que nos permitan aplicar esos ligeros cambios entre entornos.
Twig serialize filter
Históricamente Symfony ha propuesto varias opciones para compartir la información del backend en el frontend, como por ejemplo utilizar Twig para renderizar el valor de una variable JavaScript, o utilizar una petición AJAX. Ahora además podemos utilizar el filtro serialize, que nos permitirá serializar cualquier variable que el componente Serializer sea capaz de convertir en una cadena. Como propone el ejemplo del blog oficial, se puede utilizar para pasar información a un controller de Stimulus, una solución genial que pule un poco más la experiencia del desarrollador siguiendo la propuesta que hace el framework para desarrollar frontend.
Form field sorting
A partir de Symfony 5.3 tendremos disponible la opción priority al añadir un campo a un formulario. La utilidad de esta nueva opción es poder determinar el orden en el que se renderizan los campos de manera sencilla. En ocasiones lo más cómodo era simplemente renderizar las filas del formulario por separado en Twig, para especificar el orden de esa manera, pero con esta adición tenemos una forma muy simple de decidir en qué orden aparecerán los campos de nuestro formulario al renderizarse.
External translation providers
Trabajar con traducciones y traductores externos al equipo puede resultar tedioso: actualizar los catálogos con las nuevas traducciones, enviar los archivos correspondientes a los traductores e incluir en el proyecto las traducciones que nos faciliten conforman el flujo mínimo de trabajo. Con la integración de servicios SaaS de traducción este flujo de trabajo puede simplificarse en gran medida, utilizando simplemente los comandos translation:push para enviar el catálogo al SaaS y translation:pull para añadir las nuevas traducciones a nuestro proyecto.
Runtime component
El nuevo componente Runtime extrae la lógica que hasta ahora aparecía en los front controllers (public/index.php y bin/console) en los llamados runtimes. Este esfuerzo está enfocado en desacoplar la inicialización de nuestra aplicación del estado del runtime, de manera que nos va a permitir poder ejecutar nuestra aplicación en distintos entornos como PHP-FPM, ReactPHP o Swoole sin hacer cambios a nivel de aplicación.