Mise en place d’un cache Twig
L’objectif est de diminuer le nombre de requêtes effectuées et de profiter d’une fonctionnalité de cache disponible avec Twig.
Présentation
Dans le cadre d’un projet perso, j’ai fait le choix (totalement discutable) de séparer une page en plusieurs “template” Twig sachant que chaque template est responsable de sa récupération de données.
En gros, j’utilise la fonctionnalité render
:
<div class="main-content">
{{ render(path('orbit_presentation')) }}
{{ render(path('orbit_liste')) }}
</div>
L’avantage est que chaque partie est indépendante. L’inconvénient est que je me trouve avec un nombre de requêtes importantes (> 20) d’autant plus que les données changent peu (voir jamais …).
Twig Cache Extension
Dans la formation Symfony 4 par l’exemple, “GrafiKart” propose de mettre en cache via une extension Twig : TwigCacheExtension.
Comme pour beaucoup d’éléments, il faut commencer par installer : composer require twig/cache-extension
.
Puis, il suffit d’entourer la zone que l’on souhaite mettre en cache avec le code adéquat :
{% cache 'cle_cache' duree_en_secondes %}
{# les éléments à mettre en cache #}
{% endcache %}
Le résultat est immédiat :
- Premier appel :
- Deuxième appel :
19 requêtes de moins !
En termes de temps : 81 ms au lieu de 451 … Bref c’est bien.
Mettre à jour le cache
Par contre dans notre cas, la clé et la durée sont dans le code. Il serait intéressant de pouvoir gérer cela suite à un mise à jour depuis la base de données.
Dans le code existant met à jour une date sur l’utilisateur qui est chargé donc il est possible de faire :
{% cache 'utilisateur' ~ utilisateur.updatedAt.timestamp utilisateur.updatedAt.timestamp %}
{# code #}
{% endcache %}
Donc le cache sera rechargé si les données de l’utilisateur change. J’ai volontairement utilisé aussi un timestamp qui va être important pour que le cache reste valide longtemps.