
Utiliser les layouts Blade avec `@extends`, `@section` et `@yield` pour des templates réutilisables
Maîtrisez l'héritage de templates Blade avec `@extends`, `@section` et `@yield` pour créer des layouts HTML cohérents et réutilisables dans vos applications Laravel.
Layouts Blade : la clé de la cohérence et de la réutilisabilité (DRY)
Dans la plupart des applications web, de nombreuses pages partagent une structure HTML commune : un en-tête (header), une barre de navigation, un pied de page (footer), et souvent une barre latérale. Répéter ce code HTML sur chaque page individuelle serait non seulement fastidieux mais aussi un cauchemar à maintenir (principe WET : We Enjoy Typing, ou Write Everything Twice). Si vous deviez modifier la navigation, vous auriez à le faire sur des dizaines de fichiers. C'est ici qu'intervient le concept d'héritage de templates, une fonctionnalité puissante de Blade qui promeut le principe DRY (Don't Repeat Yourself).
Blade vous permet de définir un ou plusieurs "layouts" (ou gabarits) qui servent de squelette pour vos pages. Un layout contient la structure HTML commune et définit des "sections" que les vues enfants peuvent remplir avec leur contenu spécifique. Ainsi, chaque vue enfant n'a besoin que de spécifier le contenu unique qui la différencie des autres, tout en héritant de la structure et des éléments communs du layout.
Les trois directives principales pour implémenter l'héritage de templates dans Blade sont @extends, @section, et @yield. Comprendre leur interaction est fondamental pour construire des applications Laravel bien structurées, dont l'interface utilisateur est facile à maintenir et à faire évoluer.
Définir un layout de base : la directive @yield
Un layout Blade est simplement un fichier .blade.php (par exemple, resources/views/layouts/app.blade.php) qui contient la structure HTML de base de vos pages. A l'intérieur de ce layout, vous utilisez la directive @yield('nomDeLaSection') pour marquer les emplacements où les vues enfants pourront injecter leur propre contenu.
Voici un exemple simple de fichier layout :
@yield('titrePage', config('app.name', 'Laravel'))
@stack('styles_specifiques')
@yield('contenuPrincipal')
@stack('scripts_specifiques')
Dans cet exemple :
@yield('titrePage', config('app.name', 'Laravel'))définit une section nomméetitrePage. Le second argument est une valeur par défaut qui sera utilisée si la vue enfant ne fournit pas de contenu pour cette section.@yield('contenuPrincipal')définit la section principale où le contenu spécifique de chaque page sera inséré.@stack('styles_specifiques')et@stack('scripts_specifiques')sont des emplacements où les vues enfants peuvent "pousser" des balisesouspécifiques à l'aide de la directive@push. C'est utile pour les CSS ou JS qui ne sont nécessaires que sur certaines pages.
Vous pouvez définir autant de sections @yield que nécessaire dans votre layout. Choisissez des noms de section clairs et descriptifs (par exemple, sidebar, headerScripts, footerContent).
Etendre un layout et définir des sections : @extends et @section
Pour qu'une vue utilise un layout, elle doit "l'étendre". Cela se fait avec la directive @extends('chemin.vers.le.layout'), qui doit être la toute première instruction dans le fichier Blade de la vue enfant. Le chemin vers le layout est spécifié en utilisant la notation par points, relative au répertoire resources/views (par exemple, layouts.app pour resources/views/layouts/app.blade.php).
Une fois le layout étendu, la vue enfant définit le contenu pour les sections déclarées avec @yield dans le layout. Cela se fait en utilisant la directive @section('nomDeLaSection') ... @endsection. Le contenu placé entre @section et @endsection remplacera le @yield correspondant dans le layout.
Voici un exemple de vue enfant (par exemple, resources/views/pages/contact.blade.php) qui étend le layout layouts.app :
@extends('layouts.app')
@section('titrePage', 'Contactez-nous - Mon Application')
@section('contenuPrincipal')
Page de Contact
Utilisez le formulaire ci-dessous pour nous envoyer un message.
@endsection
@push('scripts_specifiques')
@endpushDans cet exemple :
@extends('layouts.app')indique que cette vue utiliseapp.blade.phpcomme layout.@section('titrePage', 'Contactez-nous - Mon Application')est une forme courte pour définir une section qui ne contient qu'une simple chaîne de caractères. Elle remplit le@yield('titrePage')du layout.- Le bloc
@section('contenuPrincipal') ... @endsectiondéfinit le HTML qui sera injecté à l'emplacement de@yield('contenuPrincipal')dans le layout. @push('scripts_specifiques') ... @endpushajoute un script à la pilescripts_specifiquesdéfinie dans le layout.
Sections avec contenu par défaut et héritage de section : @section/@show et @parent
Parfois, vous souhaitez qu'une section dans un layout ait un contenu par défaut, mais que les vues enfants puissent l'ajouter ou le remplacer. Au lieu de @yield, vous pouvez définir une section directement dans le layout en utilisant @section('nomDeLaSection') ... @show.
Une vue enfant peut alors choisir de :
- Remplacer complètement cette section :
@section('barreLaterale')
<h3>Menu Spécifique à la Page</h3>
<p>Contenu unique de la barre latérale pour cette page.</p>
@endsection- Ajouter au contenu par défaut en utilisant la directive
@parentà l'intérieur de sa propre définition de section.@parentinjectera le contenu de la section telle qu'elle est définie dans le layout parent.
@section('barreLaterale')
@parent
Liens Additionnels
@endsectionSi une vue enfant n'inclut pas de directive @section('barreLaterale'), c'est le contenu par défaut défini avec @section/@show dans le layout qui sera affiché.
Inclusion de sous-vues (partials) : Pour des morceaux de code réutilisables qui ne constituent pas un layout entier (par exemple, un formulaire, une carte de produit, une barre de navigation), vous pouvez utiliser la directive @include('chemin.vers.la.partial'). Les données disponibles dans la vue parente le sont également dans la vue incluse. Vous pouvez aussi passer des données spécifiques à la vue incluse : @include('partials.alerte', ['type' => 'succes', 'message' => 'Opération réussie !']).
@include('partials.navigation')
En combinant judicieusement @extends, @section, @yield, @parent, @push/@stack, et @include, vous pouvez construire des systèmes de templates très flexibles, modulaires et faciles à maintenir pour vos applications Laravel, peu importe leur complexité.