Contactez-nous

Héritage de templates (`extends`, `block`) pour une structure cohérente

Maîtrisez l'héritage de templates dans Twig avec les tags `extends` et `block`. Apprenez à créer des layouts de base réutilisables et à construire des pages web cohérentes et faciles à maintenir dans Symfony.

Introduction à l'héritage de templates : le principe DRY appliqué aux vues

L'une des fonctionnalités les plus puissantes de Twig est son système d'héritage de templates. Ce mécanisme permet de définir un squelette de base (ou "layout") pour votre site web, contenant les éléments communs à toutes les pages (ou à un ensemble de pages), comme l'en-tête, le pied de page, la navigation, les inclusions de CSS et JavaScript, etc. Les templates enfants peuvent ensuite "hériter" de ce squelette et ne surcharger que les parties spécifiques qui diffèrent.

Ce concept est une application directe du principe DRY (Don't Repeat Yourself) à vos vues. Au lieu de copier-coller la structure HTML commune dans chaque page, vous la définissez une seule fois dans un template parent. Cela rend votre code de template beaucoup plus facile à maintenir : si vous devez modifier l'en-tête du site, vous ne le faites qu'à un seul endroit (le template parent), et la modification est répercutée sur toutes les pages qui en héritent.

L'héritage dans Twig repose sur deux tags principaux : {% extends '...' %} pour spécifier le template parent, et {% block nom_du_bloc %} ... {% endblock %} pour définir des zones de contenu que les templates enfants peuvent redéfinir.

Définir un template de base (layout) avec des `block`

Un template de base, souvent nommé base.html.twig et placé à la racine du répertoire templates/, définit la structure HTML globale de votre site. A l'intérieur de ce template, vous allez identifier les zones qui seront variables d'une page à l'autre et les marquer avec des tags {% block %}.

Chaque {% block %} a un nom unique. Ce nom servira de référence pour les templates enfants qui voudront surcharger son contenu. Un bloc peut avoir un contenu par défaut, qui sera utilisé si un template enfant n'en fournit pas de nouveau.

Voici un exemple simple de templates/base.html.twig :




    
    
    {% block title %}Mon Super Site{% endblock %}
    {% block stylesheets %}
        {# Exemple d'inclusion de CSS avec Webpack Encore #}
        {# {{ encore_entry_link_tags('app') }} #}
        
    {% endblock %}


    
{% block body %} {% endblock %}

© {% block copyright_year %}{{ 'now' | date('Y') }}{% endblock %} Mon Entreprise. Tous droits réservés.

{% block javascripts %} {# Exemple d'inclusion de JS avec Webpack Encore #} {# {{ encore_entry_script_tags('app') }} #} <script src="{{ asset('js/main.js') }}"></script> {% endblock %}

Dans ce layout, nous avons défini plusieurs blocs :

  • title : Pour le titre de la page (dans la balise </code>). Il a un contenu par défaut "Mon Super Site".</li><li><code>stylesheets</code> : Pour inclure les feuilles de style CSS spécifiques à une page, en plus des styles globaux.</li><li><code>body</code> : Le bloc principal où le contenu spécifique de chaque page sera inséré.</li><li><code>copyright_year</code> : Pour l'année du copyright, avec l'année actuelle par défaut.</li><li><code>javascripts</code> : Pour inclure les fichiers JavaScript spécifiques à une page.</li></ul></section><section><h2 id="section-etendre-un-template-de-base-avec-extends-et-surcharger-les-block">Etendre un template de base avec `extends` et surcharger les `block`</h2><p>Maintenant que nous avons un template de base, les templates spécifiques à chaque page (par exemple, la page d'accueil, une page de produit, etc.) peuvent en hériter en utilisant le tag <code>{% extends %}</code>. Ce tag doit être la toute première instruction dans le fichier template enfant.</p><p>Une fois le template parent étendu, le template enfant peut redéfinir (ou surcharger) le contenu des blocs définis dans le parent. Pour ce faire, il suffit de redéclarer le bloc avec le même nom.</p><p>Voici un exemple de template pour une page d'accueil, <code>templates/page/accueil.html.twig</code>, qui hérite de <code>base.html.twig</code> :</p><pre class="line-numbers"><code class="language-twig">{% extends 'base.html.twig' %} {# Doit être la première ligne #} {# Surcharge du bloc 'title' défini dans base.html.twig #} {% block title %}Accueil - Bienvenue sur Mon Super Site{% endblock %} {# Surcharge du bloc 'stylesheets' pour ajouter des styles spécifiques #} {% block stylesheets %} {{ parent() }} {# Inclut le contenu original du bloc parent (style.css) #} <link rel="stylesheet" href="{{ asset('css/accueil.css') }}"> {% endblock %} {# Surcharge du bloc 'body' pour le contenu principal de la page d'accueil #} {% block body %} <div class="jumbotron"> <h1>Bienvenue !</h1> <p>Découvrez nos incroyables produits et services.</p> <a href="{{ path('app_produits_list') }}" class="btn btn-primary">Voir les produits</a> </div> <section class="dernieres-nouvelles"> <h2>Dernières nouvelles</h2> <!-- ... contenu des nouvelles ... --> </section> {% endblock %} {# Le bloc 'javascripts' n'est pas surchargé ici, donc il utilisera #} {# le contenu par défaut de base.html.twig (main.js) #} {# Le bloc 'copyright_year' n'est pas surchargé non plus, il affichera l'année actuelle #}</code></pre><p>Points importants à noter :</p><ul><li><code>{% extends 'base.html.twig' %}</code> indique que ce template hérite de <code>base.html.twig</code>.</li><li>Chaque <code>{% block nom_du_bloc %} ... {% endblock %}</code> dans ce fichier remplace le contenu du bloc du même nom dans <code>base.html.twig</code>.</li><li>La fonction <code>parent()</code> : Dans un bloc surchargé (comme <code>stylesheets</code> ici), si vous voulez inclure le contenu original du bloc parent en plus de votre nouveau contenu, vous pouvez appeler <code>{{ parent() }}</code>. C'est très utile pour ajouter des CSS/JS spécifiques à une page sans perdre les CSS/JS globaux.</li><li>Si un bloc du parent n'est pas redéfini dans l'enfant (comme <code>javascripts</code> ou <code>copyright_year</code> dans cet exemple), son contenu par défaut (s'il en a un) sera utilisé. Si le bloc parent était vide et n'est pas surchargé, il restera vide.</li></ul></section><section><h2 id="section-heritage-multiple-et-organisation-des-templates">Héritage multiple et organisation des templates</h2><p>L'héritage de templates dans Twig peut s'étendre sur plusieurs niveaux (héritage multiple). Par exemple, vous pourriez avoir :</p><ul><li><code>base.html.twig</code> : Layout global du site.</li><li><code>blog/layout.html.twig</code> : Un layout spécifique pour la section blog, qui <em>étend</em> <code>base.html.twig</code> et définit des blocs supplémentaires ou surcharge des blocs de <code>base.html.twig</code> (par exemple, pour ajouter une barre latérale spécifique au blog).</li><li><code>blog/post_show.html.twig</code> : Le template pour afficher un article de blog, qui <em>étend</em> <code>blog/layout.html.twig</code> et remplit les blocs de contenu spécifiques à l'article.</li></ul><p>Cette capacité à chaîner l'héritage permet une organisation très modulaire et flexible de vos templates. Vous pouvez créer des layouts pour différentes sections de votre site (blog, boutique, panel d'administration) qui héritent tous du layout principal, tout en partageant certains éléments communs et en spécialisant d'autres.</p><p><b>Conseils pour une bonne organisation :</b></p><ul><li><b>Nommez vos blocs de manière sémantique</b> : Utilisez des noms clairs et descriptifs pour vos blocs (<code>main_content</code>, <code>sidebar_right</code>, <code>page_scripts</code>) pour faciliter la compréhension.</li><li><b>Gardez les layouts de base concis</b> : Le <code>base.html.twig</code> devrait contenir uniquement la structure la plus fondamentale. Les éléments spécifiques à des sections peuvent aller dans des layouts intermédiaires.</li><li><b>Utilisez des sous-répertoires</b> : Organisez vos templates dans des sous-répertoires dans <code>templates/</code> pour refléter la structure de votre application (par exemple, <code>templates/product/</code>, <code>templates/security/</code>, <code>templates/admin/</code>). Cela rend les chemins dans <code>extends</code> et <code>include</code> plus clairs.</li></ul><p>L'héritage de templates est une pierre angulaire de la construction d'interfaces utilisateur maintenables et évolutives avec Symfony et Twig. Sa maîtrise vous permettra de gagner énormément de temps et de garantir une cohérence visuelle et structurelle à travers l'ensemble de votre application.</p></section><div id="quizz"></div><p id="pagination"><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/passer-des-donnees-du-controleur-au-template" title="Symfony : transmettre efficacement les données du contrôleur au template Twig" rel="prev">◄ Précédent</a> <a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/inclusion-de-fragments-de-templates-include" title="Symfony & Twig : inclure des fragments de templates avec `include`" rel="next">Suivant ►</a></p></div></div><input type="checkbox" id="rightSidebarToggle" class="rightSidebarToggle toggle"><label for="rightSidebarToggle" id="rightSidebarToggleButton" class="toggleBtn">く</label><nav id="summary" class="rightSidebar" aria-label="Table des matières" itemscope itemtype="http://schema.org/SiteNavigationElement"><h2>Table des matières</h2><meta itemprop="description" content="Table des matières pour Symfony : démarrez et construisez"> <ol class="summary"><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/introduction-a-symfony-et-votre-environnement-de-travail" itemprop="url" title="Introduction à Symfony et votre environnement de travail"><span itemprop="name">Introduction à Symfony et votre environnement de travail</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/qu-est-ce-que-symfony-et-pourquoi-l-utiliser" itemprop="url" title="Qu'est-ce que Symfony et pourquoi l'utiliser ?"><span itemprop="name">Qu'est-ce que Symfony et pourquoi l'utiliser ?</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/principes-cles-et-philosophie-de-symfony" itemprop="url" title="Principes clés et philosophie de Symfony"><span itemprop="name">Principes clés et philosophie de Symfony</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/avantages-de-symfony-pour-les-projets-web-modernes" itemprop="url" title="Avantages de Symfony pour les projets web modernes"><span itemprop="name">Avantages de Symfony pour les projets web modernes</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/vocabulaire-essentiel-framework-composant-bundle-mvc-modele-vue-controleur" itemprop="url" title="Vocabulaire essentiel : Framework, composant, bundle, MVC (Modèle-Vue-Contrôleur)"><span itemprop="name">Vocabulaire essentiel : Framework, composant, bundle, MVC (Modèle-Vue-Contrôleur)</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/preparation-de-votre-environnement-de-developpement" itemprop="url" title="Préparation de votre environnement de développement"><span itemprop="name">Préparation de votre environnement de développement</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/installation-de-php-composer-et-du-symfony-cli" itemprop="url" title="Installation de PHP, Composer et du Symfony CLI"><span itemprop="name">Installation de PHP, Composer et du Symfony CLI</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/creation-de-votre-premier-projet-symfony-avec-symfony-cli" itemprop="url" title="Création de votre premier projet Symfony avec Symfony CLI"><span itemprop="name">Création de votre premier projet Symfony avec Symfony CLI</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/tour-d-horizon-de-la-structure-d-un-projet-symfony" itemprop="url" title="Tour d'horizon de la structure d'un projet Symfony"><span itemprop="name">Tour d'horizon de la structure d'un projet Symfony</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/configuration-de-base-de-votre-editeur-de-code-par-exemple-vs-code-avec-extensions-utiles" itemprop="url" title="Configuration de base de votre éditeur de code (par exemple VS Code avec extensions utiles)"><span itemprop="name">Configuration de base de votre éditeur de code (par exemple VS Code avec extensions utiles)</span></a></li></ol></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/les-piliers-de-symfony-pour-demarrer" itemprop="url" title="Les piliers de Symfony pour démarrer"><span itemprop="name">Les piliers de Symfony pour démarrer</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/le-routage-diriger-les-requetes-utilisateur" itemprop="url" title="Le routage : diriger les requêtes utilisateur"><span itemprop="name">Le routage : diriger les requêtes utilisateur</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/definition-des-routes-via-les-attributs-annotations-dans-les-controleurs" itemprop="url" title="Définition des routes via les attributs (annotations) dans les contrôleurs"><span itemprop="name">Définition des routes via les attributs (annotations) dans les contrôleurs</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/parametres-de-route-et-generation-d-url-dynamiques" itemprop="url" title="Paramètres de route et génération d'URL dynamiques"><span itemprop="name">Paramètres de route et génération d'URL dynamiques</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/visualiser-les-routes-avec-symfony-cli-debug-router" itemprop="url" title="Visualiser les routes avec Symfony CLI (`debug:router`)"><span itemprop="name">Visualiser les routes avec Symfony CLI (`debug:router`)</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/les-controleurs-coeur-de-la-logique-applicative" itemprop="url" title="Les contrôleurs : coeur de la logique applicative"><span itemprop="name">Les contrôleurs : coeur de la logique applicative</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/creer-un-controleur-et-ses-methodes-actions-avec-make-controller" itemprop="url" title="Créer un contrôleur et ses méthodes (actions) avec `make:controller`"><span itemprop="name">Créer un contrôleur et ses méthodes (actions) avec `make:controller`</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/gerer-l-objet-request-pour-acceder-aux-donnees-de-la-requete" itemprop="url" title="Gérer l'objet `Request` pour accéder aux données de la requête"><span itemprop="name">Gérer l'objet `Request` pour accéder aux données de la requête</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/retourner-des-objets-response-html-json" itemprop="url" title="Retourner des objets `Response` (HTML, JSON)"><span itemprop="name">Retourner des objets `Response` (HTML, JSON)</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/les-templates-twig-afficher-dynamiquement-vos-donnees" itemprop="url" title="Les templates Twig : afficher dynamiquement vos données"><span itemprop="name">Les templates Twig : afficher dynamiquement vos données</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/introduction-a-la-syntaxe-de-twig-variables-filtres-fonctions-et-structures-de-controle" itemprop="url" title="Introduction à la syntaxe de Twig : variables, filtres, fonctions et structures de contrôle"><span itemprop="name">Introduction à la syntaxe de Twig : variables, filtres, fonctions et structures de contrôle</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/passer-des-donnees-du-controleur-au-template" itemprop="url" title="Passer des données du contrôleur au template"><span itemprop="name">Passer des données du contrôleur au template</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/heritage-de-templates-extends-block-pour-une-structure-coherente" itemprop="url" title="Héritage de templates (`extends`, `block`) pour une structure cohérente"><span itemprop="name">Héritage de templates (`extends`, `block`) pour une structure cohérente</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/inclusion-de-fragments-de-templates-include" itemprop="url" title="Inclusion de fragments de templates (`include`)"><span itemprop="name">Inclusion de fragments de templates (`include`)</span></a></li></ol></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/votre-premier-flux-de-travail-avec-symfony" itemprop="url" title="Votre premier flux de travail avec Symfony"><span itemprop="name">Votre premier flux de travail avec Symfony</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/de-la-requete-a-la-reponse-le-cycle-de-vie-symfony-simplifie" itemprop="url" title="De la requête à la réponse : Le cycle de vie Symfony simplifié"><span itemprop="name">De la requête à la réponse : Le cycle de vie Symfony simplifié</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/comprendre-comment-symfony-traite-une-requete-http-entrante" itemprop="url" title="Comprendre comment Symfony traite une requête HTTP entrante"><span itemprop="name">Comprendre comment Symfony traite une requête HTTP entrante</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/le-role-central-du-noyau-kernel-et-du-routeur" itemprop="url" title="Le rôle central du noyau (Kernel) et du routeur"><span itemprop="name">Le rôle central du noyau (Kernel) et du routeur</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/creer-une-page-web-simple-de-a-a-z" itemprop="url" title="Créer une page web simple de A à Z"><span itemprop="name">Créer une page web simple de A à Z</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-1-definir-une-nouvelle-route" itemprop="url" title="Etape 1 : Définir une nouvelle route"><span itemprop="name">Etape 1 : Définir une nouvelle route</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-2-implementer-la-logique-dans-un-nouveau-controleur" itemprop="url" title="Etape 2 : Implémenter la logique dans un nouveau contrôleur"><span itemprop="name">Etape 2 : Implémenter la logique dans un nouveau contrôleur</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-3-creer-un-template-twig-pour-afficher-les-informations" itemprop="url" title="Etape 3 : Créer un template Twig pour afficher les informations"><span itemprop="name">Etape 3 : Créer un template Twig pour afficher les informations</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/tester-et-deboguer-la-page" itemprop="url" title="Tester et déboguer la page"><span itemprop="name">Tester et déboguer la page</span></a></li></ol></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/les-outils-essentiels-pour-etre-productif" itemprop="url" title="Les outils essentiels pour être productif"><span itemprop="name">Les outils essentiels pour être productif</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/symfony-cli-votre-couteau-suisse" itemprop="url" title="Symfony CLI : Votre couteau suisse"><span itemprop="name">Symfony CLI : Votre couteau suisse</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/lancer-le-serveur-de-developpement-local-symfony-server-start" itemprop="url" title="Lancer le serveur de développement local (`symfony server:start`)"><span itemprop="name">Lancer le serveur de développement local (`symfony server:start`)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/utilisation-des-commandes-make-pour-generer-du-code-controleur-entite-formulaire" itemprop="url" title="Utilisation des commandes `make:*` pour générer du code (contrôleur, entité, formulaire)"><span itemprop="name">Utilisation des commandes `make:*` pour générer du code (contrôleur, entité, formulaire)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/commandes-de-debogage-utiles-debug-router-debug-autowiring" itemprop="url" title="Commandes de débogage utiles (`debug:router`, `debug:autowiring`)"><span itemprop="name">Commandes de débogage utiles (`debug:router`, `debug:autowiring`)</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/la-web-debug-toolbar-et-le-profiler-vos-allies-pour-le-debogage" itemprop="url" title="La Web Debug Toolbar et le Profiler : Vos alliés pour le débogage"><span itemprop="name">La Web Debug Toolbar et le Profiler : Vos alliés pour le débogage</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/presentation-de-la-web-debug-toolbar-informations-en-temps-reel" itemprop="url" title="Présentation de la Web Debug Toolbar : Informations en temps réel"><span itemprop="name">Présentation de la Web Debug Toolbar : Informations en temps réel</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/exploration-du-profiler-symfony-pour-une-analyse-detaillee-requetes-performance-logs" itemprop="url" title="Exploration du Profiler Symfony pour une analyse détaillée (requêtes, performance, logs)"><span itemprop="name">Exploration du Profiler Symfony pour une analyse détaillée (requêtes, performance, logs)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/utiliser-la-fonction-dump-pour-inspecter-des-variables" itemprop="url" title="Utiliser la fonction `dump()` pour inspecter des variables"><span itemprop="name">Utiliser la fonction `dump()` pour inspecter des variables</span></a></li></ol></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/gestion-des-defis-et-erreurs-courantes" itemprop="url" title="Gestion des défis et erreurs courantes"><span itemprop="name">Gestion des défis et erreurs courantes</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/comprendre-et-interpreter-les-messages-d-erreur-de-symfony" itemprop="url" title="Comprendre et interpréter les messages d'erreur de Symfony"><span itemprop="name">Comprendre et interpréter les messages d'erreur de Symfony</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/identifier-la-source-du-probleme-lire-la-trace-d-appels-stack-trace" itemprop="url" title="Identifier la source du problème : Lire la trace d'appels (stack trace)"><span itemprop="name">Identifier la source du problème : Lire la trace d'appels (stack trace)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/erreurs-frequentes-notfoundhttpexception-route-non-trouvee-erreurs-de-syntaxe-twig-problemes-de-services-non-disponibles" itemprop="url" title="Erreurs fréquentes : `NotFoundHttpException` (route non trouvée), erreurs de syntaxe Twig, problèmes de services non disponibles"><span itemprop="name">Erreurs fréquentes : `NotFoundHttpException` (route non trouvée), erreurs de syntaxe Twig, problèmes de services non disponibles</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/techniques-de-debogage-de-base-et-ou-trouver-de-l-aide" itemprop="url" title="Techniques de débogage de base et où trouver de l'aide"><span itemprop="name">Techniques de débogage de base et où trouver de l'aide</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/consulter-les-logs-de-l-application-var-log-dev-log" itemprop="url" title="Consulter les logs de l'application (`var/log/dev.log`)"><span itemprop="name">Consulter les logs de l'application (`var/log/dev.log`)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/rechercher-dans-la-documentation-officielle-de-symfony" itemprop="url" title="Rechercher dans la documentation officielle de Symfony"><span itemprop="name">Rechercher dans la documentation officielle de Symfony</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/utiliser-les-communautes-en-ligne-stack-overflow-forums" itemprop="url" title="Utiliser les communautés en ligne (Stack Overflow, forums)"><span itemprop="name">Utiliser les communautés en ligne (Stack Overflow, forums)</span></a></li></ol></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/bonnes-pratiques-fondamentales-pour-un-code-de-qualite" itemprop="url" title="Bonnes pratiques fondamentales pour un code de qualité"><span itemprop="name">Bonnes pratiques fondamentales pour un code de qualité</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/organisation-du-code-et-conventions-de-nommage" itemprop="url" title="Organisation du code et conventions de nommage"><span itemprop="name">Organisation du code et conventions de nommage</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/respecter-la-structure-de-dossiers-de-symfony" itemprop="url" title="Respecter la structure de dossiers de Symfony"><span itemprop="name">Respecter la structure de dossiers de Symfony</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/conventions-de-nommage-pour-les-classes-methodes-variables-et-templates" itemprop="url" title="Conventions de nommage pour les classes, méthodes, variables et templates"><span itemprop="name">Conventions de nommage pour les classes, méthodes, variables et templates</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/introduction-aux-services-et-a-l-injection-de-dependances" itemprop="url" title="Introduction aux services et à l'injection de dépendances"><span itemprop="name">Introduction aux services et à l'injection de dépendances</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/qu-est-ce-qu-un-service-dans-symfony" itemprop="url" title="Qu'est-ce qu'un service dans Symfony ?"><span itemprop="name">Qu'est-ce qu'un service dans Symfony ?</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/comprendre-l-autowiring-et-l-injection-de-dependances-dans-les-controleurs" itemprop="url" title="Comprendre l'autowiring et l'injection de dépendances dans les contrôleurs"><span itemprop="name">Comprendre l'autowiring et l'injection de dépendances dans les contrôleurs</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/avantages-code-plus-modulaire-testable-et-maintenable" itemprop="url" title="Avantages : Code plus modulaire, testable et maintenable"><span itemprop="name">Avantages : Code plus modulaire, testable et maintenable</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/principes-de-base-de-la-securite" itemprop="url" title="Principes de base de la sécurité"><span itemprop="name">Principes de base de la sécurité</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/protection-automatique-contre-xss-avec-twig" itemprop="url" title="Protection automatique contre XSS avec Twig"><span itemprop="name">Protection automatique contre XSS avec Twig</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/importance-de-la-validation-des-donnees-sera-approfondi-plus-tard" itemprop="url" title="Importance de la validation des données (sera approfondi plus tard)"><span itemprop="name">Importance de la validation des données (sera approfondi plus tard)</span></a></li></ol></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/mise-en-pratique-guidee-votre-premier-mini-projet" itemprop="url" title="Mise en pratique guidée : Votre premier mini-projet"><span itemprop="name">Mise en pratique guidée : Votre premier mini-projet</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/projet-guide-creation-d-un-gestionnaire-de-taches-simple-sans-base-de-donnees" itemprop="url" title="Projet guidé : Création d'un gestionnaire de tâches simple (sans base de données)"><span itemprop="name">Projet guidé : Création d'un gestionnaire de tâches simple (sans base de données)</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/objectif-lister-des-taches-afficher-le-detail-d-une-tache" itemprop="url" title="Objectif : Lister des tâches, afficher le détail d'une tâche"><span itemprop="name">Objectif : Lister des tâches, afficher le détail d'une tâche</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-1-definir-les-routes-necessaires-liste-detail" itemprop="url" title="Etape 1 : Définir les routes nécessaires (liste, détail)"><span itemprop="name">Etape 1 : Définir les routes nécessaires (liste, détail)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-2-creer-le-controleur-pour-gerer-la-logique-donnees-en-dur-pour-l-instant" itemprop="url" title="Etape 2 : Créer le contrôleur pour gérer la logique (données en dur pour l'instant)"><span itemprop="name">Etape 2 : Créer le contrôleur pour gérer la logique (données en dur pour l'instant)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-3-developper-les-templates-twig-pour-l-affichage" itemprop="url" title="Etape 3 : Développer les templates Twig pour l'affichage"><span itemprop="name">Etape 3 : Développer les templates Twig pour l'affichage</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/etape-4-ajouter-des-liens-de-navigation-entre-les-pages" itemprop="url" title="Etape 4 : Ajouter des liens de navigation entre les pages"><span itemprop="name">Etape 4 : Ajouter des liens de navigation entre les pages</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/introduction-aux-formulaires-symfony-pour-ajouter-une-tache" itemprop="url" title="Introduction aux formulaires Symfony pour ajouter une tâche"><span itemprop="name">Introduction aux formulaires Symfony pour ajouter une tâche</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/creer-un-type-de-formulaire-simple-avec-make-form" itemprop="url" title="Créer un type de formulaire simple avec `make:form`"><span itemprop="name">Créer un type de formulaire simple avec `make:form`</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/integrer-et-afficher-le-formulaire-dans-un-template-twig" itemprop="url" title="Intégrer et afficher le formulaire dans un template Twig"><span itemprop="name">Intégrer et afficher le formulaire dans un template Twig</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/gerer-la-soumission-du-formulaire-dans-le-controleur-sans-persistance-de-donnees" itemprop="url" title="Gérer la soumission du formulaire dans le contrôleur (sans persistance de données)"><span itemprop="name">Gérer la soumission du formulaire dans le contrôleur (sans persistance de données)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/rediriger-apres-soumission-et-afficher-un-message-flash" itemprop="url" title="Rediriger après soumission et afficher un message flash"><span itemprop="name">Rediriger après soumission et afficher un message flash</span></a></li></ol></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/prochaines-etapes-et-ressources-pour-aller-plus-loin" itemprop="url" title="Prochaines étapes et ressources pour aller plus loin"><span itemprop="name">Prochaines étapes et ressources pour aller plus loin</span></a><ol><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/introduction-a-doctrine-orm-pour-la-persistance-des-donnees-apercu" itemprop="url" title="Introduction à Doctrine ORM pour la persistance des données (aperçu)"><span itemprop="name">Introduction à Doctrine ORM pour la persistance des données (aperçu)</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/pistes-pour-approfondir-securite-api-tests-etc" itemprop="url" title="Pistes pour approfondir : Sécurité, API, tests, etc."><span itemprop="name">Pistes pour approfondir : Sécurité, API, tests, etc.</span></a></li><li><a href="/fr/cours/programmation/symfony/symfony-demarrez-et-construisez/ressources-recommandees-symfonycasts-documentation-officielle" itemprop="url" title="Ressources recommandées : SymfonyCasts, documentation officielle"><span itemprop="name">Ressources recommandées : SymfonyCasts, documentation officielle</span></a></li></ol></li></ol></li> </ol></nav></main><footer id="footer" aria-labelledby="footer-heading"><div class="footer-main"><div><h2 id="footer-heading">Pied de page du site CertiQuizz</h2><p class="footer-logo"><img src="/favicon.svg" alt="Logo CertiQuizz" width="40" height="40"><span>ertiQuizz</span></p><p class="footer-description">Votre plateforme de microlearning :<br>1. Testez vos connaissances<br>2. Apprenez de nouvelles compétences<br>3. Excellez dans votre parcours</p><p><a href="/fr/quiz/classement/" title="Classement des membres">🏆 Classement des membres</a></p></div><nav class="footer-navigation" aria-label="Navigation secondaire"><h3>Navigation</h3><ul><li><a href="/fr/quiz-qcm-certification" title="A propos de CertiQuizz, la plateforme de microlearning">A propos</a></li><li><a href="/fr/faq" title="FAQ">FAQ</a></li><li><a href="/fr/contact" title="Contact">Contact</a></li></ul></nav><nav><h3>Légal</h3><ul><li><a href="/fr/mentions-legales" title="Mentions légales">Mentions légales</a></li><li><a href="/fr/politique-de-confidentialite" title="Politique de confidentilité">Politique de confidentilité</a></li><li><a href="/fr/cgu" title="Conditions Générales d'Utilisation">Conditions Générales d'Utilisation</a></li></ul></nav><nav><h3>Suivez-nous</h3><ul><li><a href="/fr/newsletter/" title="S'abonner à la newsletter">Newsletter</a></li></ul></nav></div><div class="footer-bottom"><p>© <span id="copyYear">2025</span> CertiQuizz. Tous droits réservés.</p><p>Conçu avec un objectif d'<a href="/fr/eco-responsabilite-et-performance" title="Eco-conception">éco-conception</a></p></div></footer><div id="overlayBody"></div><div id="overlay2Body"></div><script>/*<![CDATA[*/let loaded=false,f=()=>{loaded=true;let tag = _new("link");tag.rel = "stylesheet";tag.href = "/css/prism.css";_doc.head.appendChild(tag);tag = _new("script");tag.src = "/js/prism.js";tag.async = true;_doc.head.appendChild(tag);ajax({targetId: "quizz",url: "/fr/course/quizz,event",data: {courseId: 2681,name: "heritage-de-templates-extends-block-pour-une-structure-coherente"},success: _event.onSuccess,error: _event.onError});initPageSummary("pageBody","pageSummary");activeMenu(window.location.pathname,"homeLink");initBreadcrumb();gtag("G-Y5V4QB3XL0")};document.getElementById("corejs").onload=f;window.addEventListener("load",()=>{!loaded&&f();});(async ()=>{const mb=document.getElementById("modeBtn"),dm="dark-mode",lm="light-mode",mk="mode",am=localStorage.getItem(mk),d=document.documentElement.classList;function cm(m1){const m2=m1!=dm?dm:lm,c=mb.children;d.add(m1);d.remove(m2);c[0].innerHTML=c[0].innerHTML.replace(m1,{[dm]:lm,[lm]:dm}[m1]);c[1].textContent={[dm]:"Clair",[lm]:"Sombre"}[m1];localStorage.setItem(mk,m1);}cm(am?am:dm);mb.addEventListener("click",(e)=>{e.preventDefault();cm(d.contains(dm)?lm:dm)});})();/*]]>*/</script></body></html>