Journal

Twig : macros, fonctions fléchées et sandbox, ce que vous avez peut-être raté

Journal du mercredi 26 août 2026, généré le 26 août à 21:46

Au-delà des blocks et des filtres de base

La plupart des développeurs s'arrêtent à {% extends %}, {% block %} et aux filtres classiques comme |upper ou |date. Twig 3.x offre pourtant plusieurs mécanismes qui évitent de dupliquer du HTML ou de repasser par PHP pour des transformations simples.

Macros : des fonctions réutilisables dans vos templates

Une macro se comporte comme une fonction : elle prend des arguments, peut avoir des valeurs par défaut, et s'importe explicitement dans le fichier qui l'utilise.

{# _macros.html.twig #}
{% macro input(name, value = '', type = 'text') %}
  <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}

{# formulaire.html.twig #}
{% import '_macros.html.twig' as forms %}
{{ forms.input('email', user.email, 'email') }}

Contrairement à un include, une macro ne partage pas le contexte du template appelant : c'est voulu, cela évite les effets de bord silencieux quand une variable change de nom ailleurs.

Fonctions fléchées dans les filtres de collection

Depuis Twig 2.10 (généralisé en 3.x), les filtres filter, map et reduce acceptent des fonctions fléchées, ce qui remplace des boucles {% for %} avec condition :

{{ produits|filter(p => p.stock > 0)|map(p => p.nom)|join(', ') }}

C'est strictement équivalent à un for avec if, mais plus lisible pour des transformations en une ligne.

Contrôler l'échappement finement

L'autoescaping est actif par défaut et c'est une bonne chose contre le XSS. Pour désactiver localement l'échappement sur un bloc entier plutôt que variable par variable, utilisez {% apply %} combiné à raw, ou {% autoescape false %} — mais réservez cela à du contenu réellement sûr (sortie d'un purificateur HTML type HTML Purifier), jamais à de l'input utilisateur brut.

Sandbox pour les templates non fiables

Si vos templates proviennent d'utilisateurs (CMS, éditeur WYSIWYG stockant du Twig), activez l'extension SandboxExtension : elle restreint les tags, filtres, fonctions et méthodes accessibles à une liste blanche explicite. C'est le seul moyen sûr d'exécuter du Twig généré par un tiers.

Maîtriser les espaces blancs

Le tiret dans {%- ... -%} supprime les espaces et retours à la ligne adjacents. Utile pour générer du HTML compact ou du texte brut (emails) sans multiplier les spaceless :

{% for tag in tags -%}
  {{ tag }}{% if not loop.last %}, {% endif %}
{%- endfor %}

Performance

Twig compile chaque template en classe PHP et met en cache le résultat. En production, vérifiez que cache est configuré vers un répertoire persistant et que auto_reload est désactivé : sinon Twig recompare les timestamps à chaque requête, ce qui coûte des I/O inutiles.