Journal

Twig : les fonctionnalités que les développeurs sous-utilisent

Journal du lundi 17 août 2026, généré le 23 août à 18:56

Au-delà des boucles et des filtres basiques

Twig est souvent réduit à {{ variable }}, {% for %} et {% if %}. Passé ce socle, plusieurs mécanismes permettent d'écrire des templates plus propres, plus performants et plus sûrs, notamment en Twig 3.x.

Macros et imports réutilisables

Une macro fonctionne comme une fonction de template : elle évite de dupliquer du HTML répétitif (champ de formulaire, badge, carte produit).

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

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

Contrairement à un include, une macro accepte des paramètres nommés avec valeurs par défaut, ce qui la rapproche d'une vraie fonction.

Fonctions fléchées et filtres personnalisés

Depuis Twig 2.9+/3.x, les filtres filter, map et reduce acceptent des fonctions fléchées, très utiles pour transformer une collection sans quitter le template :

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

Pour des besoins récurrents (formatage de prix, calcul métier), créer un filtre ou une fonction personnalisée via une extension PHP reste préférable à empiler des filtres natifs sur trois lignes.

Contrôle du whitespace et performance

Le tag {%- -%} supprime les espaces autour d'un bloc, ce qui compte pour du HTML minifié ou des emails. Twig compile les templates en classes PHP mises en cache automatiquement : en production, vérifiez que cache est bien configuré (répertoire persistant, pas false) et que auto_reload est désactivé, sinon chaque requête revalide le fichier source sur disque.

Sandbox et sécurité

Si des templates proviennent d'utilisateurs (CMS, thèmes personnalisables), l'extension SandboxExtension restreint les tags, filtres et méthodes accessibles :

$policy = new SecurityPolicy(
    ['if', 'for'],           // tags autorisés
    ['upper', 'length'],     // filtres autorisés
    [], [], []
);
$twig->addExtension(new SandboxExtension($policy, true));

Sans cette isolation, un template non fiable peut appeler n'importe quelle méthode PHP exposée à Twig.

Points de vigilance

  • L'échappement automatique dépend du contexte (html, js, css) : forcer |raw désactive toute protection XSS, à réserver au contenu réellement fiable.
  • {% embed %} combine héritage et inclusion : utile pour un composant réutilisable qui a besoin de blocs surchargeables, là où include seul ne suffit pas.
  • Le test is defined évite les erreurs sur des variables optionnelles, préférable à un |default systématique qui masque parfois de vrais bugs de données manquantes.