Nuevo en Symfony 3.4: mejorada la sobreescritura de plantillas

En Symfony 3.4 la herencia de bundles se ha declarado obsoleta y en symfony 4.0 ya no recomendamos utilizar bundles para tu propio código. Sin embargo, reescribir las plantillas definidas por bundles de terceros sigue siendo algo habitual y necesario. Por eso en Symfony 3.4 hemos mejorado la sobreescritura de plantillas para prepararnos mejor para Symfony 4.

Nuevo directorio para sobreescribir plantillas

En Symfony 2 y 3, las plantillas de los bundles de terceros se sobreescriben en el directorio app/Resources/<NombreDelBundle>/views/. En Symfony 4 este directorio debería haberse movido a src/, pero no nos ha parecido correcto porque es raro tener plantillas dentro de src/, sobretodo ahora que tenemos un directorio llamado templates/ en la raíz del proyecto.

Así que en Symfony 3.4 hemos definido un nuevo directorio para sobreescribir las plantillas: templates/bundles/<NombreDelBundle>/. Si por ejemplo quieres personalizar las páginas de error en una aplicación Symfony:

{# Symfony 3.3 #}
{# app/Resources/TwigBundle/views/Exception/error404.html.twig #}
¡Esta página no existe!
 
{# Symfony 3.4 #}
{# templates/bundles/TwigBundle/Exception/error404.html.twig #}
¡Esta página no existe!

Sobreescribir y extender plantillas

A veces quieres sobreescribir una plantilla de un bundle de terceros pero reutilizando la mayoría de sus contenidos, para no tener que duplicarlos. Imagina que quieres sobreescribir la plantilla layout.html.twig del bundle FOSUserBundle:

{# templates/bundles/FOSUserBundle/layout.html.twig #}
{% extends '@FOSUser/layout.html.twig' %}
{# ... esta plantilla no funciona ... #}

Si pruebas este ejemplo, Symfony mostrará un error de tipo "reached nested level" porque sobreescribir y extender a la vez una misma plantilla es como si fuera un bucle infinito. En Symfony 3.4 hemos resuelto este problema creando un nuevo namespace de Twig para cada bundle.

El nuevo namespace es el mismo que antes pero con el símbolo ! delante del nombre del bundle. En este ejemplo, @FOSUser es el namespace normal (que puede contener plantillas de terceros o tus propias plantillas) mientras que @!FOSUser es el namespace exclusivo del bundle de terceros y solo hace referencia a sus plantillas.

Gracias a este nuevo namespace es posible solucionar el problema anterior:

{# templates/bundles/FOSUserBundle/layout.html.twig #}
{% extends '@!FOSUser/layout.html.twig' %}
{# ... esta plantilla si que funciona como esperas ... #}

Mejorado el comando debug:twig

Por último, para que todos estos cambios sean más fáciles de depurar, se ha mejorado el comando debug:twig para mostrar todos los namespaces de Twig y sus directorios asociados, mostrándolos en el mismo orden de prioridad que el que utiliza Symfony.

Todas estas funcionalidades fueron contribuidas por Yonel Ceruto en los Pull Requests #24179, #24264 y #24064.

Fuente: New in Symfony 3.4: Improved the overriding of templates

Comentarios

Publicada el

10 de octubre de 2017

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.