Comprendre le mécanisme
Twig sépare la présentation et la logique applicative. Les blocs composent un héritage de templates ; include réutilise une partie de rendu. L’échappement automatique évite d’interpréter comme HTML une donnée rendue dans le contexte concerné. raw désactive cette protection : sa présence doit correspondre à un contenu réellement maîtrisé. Un filtre ne fournit pas une protection universelle pour tous les contextes JavaScript ou URL.
Raisonner et vérifier
Les clés de traduction sont résolues selon domaine et locale, avec repli prévu. Les messages comportant des nombres peuvent nécessiter un format de pluralisation adapté. Conservez les textes traduisibles séparés des identifiants métier. Pour une sortie JSON, utilisez les outils de sérialisation adaptés, groupes et normalisation au besoin ; évitez de rendre toutes les propriétés d’un objet sensible par commodité.
Contexte de sortie
L’échappement automatique dépend du contexte Twig configuré. Les sorties HTML, JavaScript et URL ont des contraintes différentes. Le texte HTML, un attribut, une URL et du JavaScript ne suivent pas les mêmes règles. Conservez les données dans le contexte prévu et vérifiez le DOM produit avec une valeur contenant guillemets et chevrons.
Erreur fréquente à comprendre
Toute variable Twig est sûre dans tout contexte possible.
Les sorties HTML, JavaScript et URL ont des contraintes différentes.
Retrait par raw
raw retire une protection d’échappement. La donnée doit déjà suivre une politique de contenu adaptée. Afficher une biographie contrôlée par un visiteur avec raw transforme du balisage en contenu actif. Si du HTML est nécessaire, appliquez une politique de nettoyage explicite adaptée à cet usage avant affichage.
Erreur fréquente à comprendre
raw rend automatiquement fiable tout contenu utilisateur.
La donnée doit déjà suivre une politique de contenu adaptée.
Domaine et locale
Les traductions ont un domaine et une locale. La présentation n’accorde pas les droits. Une clé peut exister dans messages mais manquer dans validators. Vérifiez le domaine demandé et le repli linguistique au lieu d’ajouter la même clé dans tous les catalogues sans comprendre la résolution.
Erreur fréquente à comprendre
Un texte traduit décide des permissions serveur.
La présentation n’accorde pas les droits.
Paramètres et messages
Les paramètres de traduction peuvent porter des données. Le contexte de rendu doit garder la séparation données/code. Un prénom injecté dans une traduction reste une donnée. Ne construisez pas une chaîne HTML de confiance par concaténation puis raw ; vérifiez les paramètres et les choix de pluralisation du moteur utilisé.
Erreur fréquente à comprendre
Toute valeur interpolée devient du code fiable.
Le contexte de rendu doit garder la séparation données/code.
Clés absentes
Une clé manquante doit être détectée par les vérifications. Il peut s’agir d’un repli sans message disponible. Une interface peut rester techniquement valide en affichant sa clé de traduction. Ajoutez des assertions sur les libellés importants et le repli attendu afin de détecter les erreurs visibles sans exception PHP.
Erreur fréquente à comprendre
Une page affichant une clé prouve une traduction complète.
Il peut s’agir d’un repli sans message disponible.
Héritage et blocs
Une extension de template peut séparer des blocs. Le mécanisme permet de spécialiser certains blocs. Un template enfant remplace des blocs du parent. Gardez une structure commune pour navigation et sécurité des attributs ; vérifiez qu’une surcharge ne retire pas silencieusement un formulaire ou une information obligatoire.
Erreur fréquente à comprendre
Tout template enfant doit dupliquer intégralement le parent.
Le mécanisme permet de spécialiser certains blocs.
Macros explicites
Les macros ont une portée et des arguments explicites. Les dépendances du rendu doivent être passées correctement. Passez le sujet et la locale nécessaires comme arguments de macro. Cette signature rend les dépendances visibles et évite qu’une réutilisation dans un autre contexte dépende accidentellement de variables disponibles ailleurs.
Erreur fréquente à comprendre
Une macro voit nécessairement tout état local de l’appelant.
Les dépendances du rendu doivent être passées correctement.
Liens et destination
Une URL doit être générée et validée selon son usage. Le contenu de destination demande aussi une politique. Générez les chemins internes par nom de route. Une destination externe issue d’une entrée doit encore être admise selon sa politique ; l’échappement HTML d’un lien ne rend pas son schéma acceptable.
Erreur fréquente à comprendre
Échapper une URL suffit à autoriser tout schéma.
Le contenu de destination demande aussi une politique.
Langue annoncée
Un contenu de cours français peut avoir une interface anglaise annoncée. Le contenu et les messages d’interface ont des sources différentes. Une interface anglaise peut présenter un cours français si ce choix est indiqué. Testez navigation, attribut lang et liens localisés, afin que l’apprenant connaisse la langue du contenu avant de commencer.
Erreur fréquente à comprendre
Changer la locale traduit automatiquement tout texte stocké en JSON.
Le contenu et les messages d’interface ont des sources différentes.
Contrat de présentation
Les tests doivent vérifier le texte et les attributs rendus. La syntaxe ne couvre pas l’ensemble de l’interface. Pour une API utilisateur, un DTO ou des groupes de sérialisation exposent les champs utiles. Vérifiez que hash de mot de passe, token interne et données de tiers n’apparaissent jamais dans le contrat rendu.
Erreur fréquente à comprendre
Un lint Twig prouve tout comportement interactif navigateur.
La syntaxe ne couvre pas l’ensemble de l’interface.
Atelier guidé : lire, expliquer et vérifier le code
<article>
{{ body|raw }}
</article> L’atelier retire l’échappement d’une valeur potentiellement contrôlée par un utilisateur. Injectez un exemple de balisage inoffensif dans un test local et observez le DOM. La correction doit afficher le texte attendu ou un HTML nettoyé selon une politique explicite. Contrôlez également les attributs et la sérialisation, pas seulement le texte visible.
Le filtre n’est pas un assainisseur universel. raw retire une protection au lieu d’ajouter une insertion textuelle. Le filtre de rendu ne décide pas du droit d’accès. Un contenu actif peut être interprété si aucune politique adaptée n’a été appliquée.
Travail pratique : Ajoutez un libellé contenant <script> puis vérifiez sa représentation ; rendez aussi une page en deux locales.
Critères de correction : Vérifiez le texte obtenu et l’absence de balise interprétée. Testez les liens localisés et le repli d’une clé. N’utilisez pas raw pour faire disparaître un problème de format.
Exemple commenté
{# Template Twig de laboratoire #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>{{ reservation.label }}</h1>
<a href="{{ path('app_training') }}">{{ 'catalogue.title'|trans({}, 'training') }}</a>
{% endblock %}Le libellé est échappé lors du rendu HTML. Le lien est généré par le routeur et le texte de navigation par le traducteur.
Exercice de mise en pratique
Ajoutez un libellé contenant <script> puis vérifiez sa représentation ; rendez aussi une page en deux locales.
Voir une proposition de correction
Vérifiez le texte obtenu et l’absence de balise interprétée. Testez les liens localisés et le repli d’une clé. N’utilisez pas raw pour faire disparaître un problème de format.
Points de vérification
- Éviter raw sur une entrée utilisateur.
- Tester domaines et locales.
- Limiter explicitement les données sérialisées.
Contrôle de connaissances
Cours associé : Twig, traduction et sérialisation de présentation ↗Validation du module
101 questions, objectif pédagogique de 75 %. Durée conseillée de 150 minutes, sans limite imposée. Les questions et les choix sont mélangés ; le corrigé apparaît après validation. Le contrôle rapide de la leçon et l’examen final du cours restent des exercices distincts.
Commencer ou reprendre les 101 questions →Cette marque suit votre propre avancement ; elle ne certifie pas la maîtrise du sujet. Effectuez l’exercice avant de passer à la suite.
