Una plantilla es un archivo de texto que puede generar cualquier otro formato basado en texto (HTML, XML, CSV, LaTeX, etc.). Las plantillas PHP son las más populares, como la que muestra el siguiente ejemplo:

<!DOCTYPE html>
    <html>
        <head>
        <title>¡Bienvenido a Symfony!</title>
        </head>
        <body>
        <h1><?php echo $page_title ?></h1>

        <ul id="navigation">
            <?php foreach ($navigation as $item): ?>
                <li>
                    <a href="<?php echo $item->getHref() ?>">
                        <?php echo $item->getCaption() ?>
                        </a>
                </li>
            <?php endforeach; ?>
        </ul>
    </body>
</html>

Symfony2 incluye un lenguaje de plantillas llamado Twig que es mucho más potente y elegante que PHP. Gracias a Twig puedes crear plantillas muy concisas y fáciles de leer, por lo que además son fáciles de entender por parte de los diseñadores web. Observa el mismo ejemplo anterior definido como plantilla Twig:

<!DOCTYPE html>
    <html>
        <head>
        <title>¡Bienvenido a Symfony!</title>
        </head>
        <body>
        <h1>{{ page_title }}</h1>

        <ul id="navigation">
            {% for item in navigation %}
                <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
            {% endfor %}
        </ul>
    </body>
</html>

La sintaxis de Twig se basa en dos etiquetas especiales:

  • {{ ... }}: sirve para mostrar el contenido de una variable o el resultado de realizar alguna operación o procesar alguna expresión. En PHP la construcción equivalente es echo o print.
  • {% ... %}: sirve para definir la lógica de la plantilla, es decir, la parte de programación que controla cómo se muestran los contenidos de la plantilla. Entre otros, esta etiqueta se emplea para las instrucciones if y para los buncles for.

Nota Twig define una tercera etiqueta para crear comentarios: {# esto es un comentario #}. Su sintaxis es equivalente a la de PHP (/* comentario */) por lo que puedes utilizarla para crear comentarios de varias líneas.

Twig también define filtros, que modifican los contenidos antes de mostrarlos. El siguiente ejemplo convierte a mayúsculas la variable title antes de mostrarla:

{{ title|upper }}

Twig incluye una larga lista de etiquetas y filtros listas para utilizar, pero también puedes definir tus propias extensiones de Twig si lo necesitas.

Truco Registrar una extensión de Twig es tan fácil como crear un nuevo servicio y etiquetarlo con la etiqueta twig.extension.

Como verás a lo largo de toda la documentación, Twig también incluye varias funciones e incluso te permite definir tus propias funciones. En el siguiente ejemplo, la etiqueta for utiliza la función cycle para imprimir diez etiquetas <div> cuyas clases CSS alternan entre los valores par e impar:

{% for i in 0..10 %}
    <div class="{{ cycle(['odd', 'even'], i) }}">
        {# ... #}
    </div>
{% endfor %}

En lo que resta de capítulo, todos los ejemplos muestran las plantillas tanto en formato Twig (el recomendado) como en PHP (el formato tradicional).

Truco Si no quieres utilizar Twig y lo desactivas, tendrás que implementar tu propio controlador de excepciones utilizando el evento kernel.exception.

7.1.1. Guardando las plantillas Twig en la caché

Twig es muy rápido porque todas las plantillas se compilan a código PHP antes de ejecutarlas. Las plantillas Twig compiladas se guardan por defecto en el directorio app/cache/{entorno}/twig (donde {entorno} es el entorno de ejecución, normalmente dev o prod). Si alguna vez te encuentras con un error muy extraño relacionado con alguna plantilla, busca su código fuente compilado como PHP en el directorio anterior.

Cuando está activado el modo debug (como sucede por defecto en el entorno dev), las plantillas Twig se vuelven a compilar automáticamente cada vez que haces un cambio. Así que al desarrollar la aplicación puedes hacer tantos cambios como quieras en las plantillas y verás el resultado instantáneamente, sin tener que borrar ninguna caché.

Por otra parte, cuando el modo debug está desactivado (como sucede por defecto en el entorno prod), tienes que borrar el directorio de caché para regenerar las plantillas cada vez que hagas un cambio. Recuerda hacer esto al instalar tu aplicación en el servidor.