cache

Note

La etiqueta cache se agregó en Twig 3.2.

La etiqueta cache le indica a Twig que almacene en caché un fragmento de plantilla:

{% cache "cache key" %}
    Cached forever (depending on the cache implementation)
{% endcache %}

Si deseas que el caché expire después de un cierto tiempo, especifica un tiempo de expiración en segundos mediante el modificador ttl():

{% cache "cache key" ttl(300) %}
    Cached for 300 seconds
{% endcache %}

La clave del caché puede ser cualquier cadena que no utilice los siguientes caracteres reservados {}()/\@:; una buena práctica es incorporar información útil en la clave que permita que el caché expire automáticamente cuando deba actualizarse:

  • Dale a cada caché un nombre único y organízalo por espacios de nombres como tus plantillas;
  • Incorpora un número entero que incrementes cada vez que el código de la plantilla cambie (para invalidar automáticamente todos los cachés actuales);
  • Incorpora una clave única que se actualice cada vez que cambien las variables utilizadas en el código de la plantilla.

Por ejemplo, usaría {% cache "blog_post;v1;" ~ post.id ~ ";" ~ post.updated_at %} para almacenar en caché un fragmento de plantilla de contenido de blog donde blog_post describe el fragmento de plantilla, v1 representa la primera versión del código de la plantilla, post.id representa el id de la entrada del blog, y post.updated_at devuelve una marca de tiempo que representa el momento en que la entrada del blog fue modificada por última vez.

Usar esta estrategia para nombrar las claves del caché permite evitar usar un ttl. Es como usar una estrategia de "validación" en lugar de una estrategia de "expiración" como hacemos para los cachés HTTP.

Si tu implementación de caché admite etiquetas, también puedes etiquetar tus elementos de caché:

{% cache "cache key" tags('blog') %}
    Some code
{% endcache %}

{% cache "cache key" tags(['cms', 'blog']) %}
    Some code
{% endcache %}

La etiqueta cache crea un nuevo "ámbito" para las variables, lo que significa que los cambios son locales al fragmento de plantilla:

{% set count = 1 %}

{% cache "cache key" tags('blog') %}
    {# Won't affect the value of count outside of the cache tag #}
    {% set count = 2 %}
    Some code
{% endcache %}

{# Displays 1 #}
{{ count }}

Note

La etiqueta cache es parte de la CacheExtension que no está instalada por defecto. Instálala primero:

$ composer require twig/cache-extra

En proyectos Symfony, puedes habilitarla automáticamente instalando el twig/extra-bundle:

$ composer require twig/extra-bundle

O agrega la extensión explícitamente en el entorno de Twig:

use Twig\Extra\Cache\CacheExtension;

$twig = new \Twig\Environment(...);
$twig->addExtension(new CacheExtension());

Si no estás usando Symfony, también debes registrar el runtime de la extensión:

use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
use Twig\Extra\Cache\CacheRuntime;
use Twig\RuntimeLoader\RuntimeLoaderInterface;

$twig->addRuntimeLoader(new class implements RuntimeLoaderInterface {
    public function load($class) {
        if (CacheRuntime::class === $class) {
            return new CacheRuntime(new TagAwareAdapter(new FilesystemAdapter()));
        }
    }
});