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
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.