Module 2Programmer avec Laravel
Chapitre 9 sur 10
Manipulation des vues
Créer des vues, transmettre et partager des données, compositeurs, créateurs, optimisation et bases de Blade.
- ≈ 120 min
- 4 leçons
- 2 vidéos
- 3 exercices
- TP
Objectifs
Avec ce chapitre, tu sauras…
- créer une vue et l'afficher depuis une route ;
- organiser les vues en sous-dossiers ;
- transmettre des données à une vue et les partager avec toutes les vues ;
- utiliser les compositeurs et les créateurs de vues ;
- optimiser les vues en production ;
- connaître les bases de Blade utilisées dans les vues.
Leçon 1
La création des vues
Écrire tout le HTML dans les routes n'est pas pratique. Les vues mettent le HTML dans des fichiers séparés : elles séparent la logique (contrôleur) de la présentation (affichage). Elles sont rangées dans resources/views.
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});L'extension .blade.php indique que le fichier utilise le moteur Blade : du HTML avec des directives (@if, @foreach…) et l'affichage de variables avec {{ }}.
- Le premier argument de
view()est le nom du fichier (sans.blade.php). - Le deuxième est un tableau de données : la clé
namedevient la variable$namedans la vue.
On peut aussi utiliser la façade View :
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);Les sous-dossiers
Les vues peuvent être dans des sous-dossiers ; on utilise alors la notation point :
return view('admin.profile', $data); // resources/views/admin/profile.blade.phpUn nom de dossier de vues ne doit pas contenir de point.
La première vue disponible et l'existence d'une vue
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data); // la première vue qui existe
if (View::exists('emails.customer')) {
// la vue existe
}Vidéo · À regarder
FRDécouverte de Laravel 10 : Moteur de template Blade
Grafikart · YouTube
Le moteur de template Blade : créer une vue, afficher des variables avec {{ }} (protégées contre le XSS), conditions et boucles avec @if et @foreach, layouts. Regarde-la en entier (18 minutes) : c'est la base de toutes tes pages.
Tableau: Les bases de Blade à connaître
| Écriture Blade | Rôle |
|---|---|
{{ $nom }} | afficher une variable en la protégeant (le HTML est échappé, contre le XSS) |
{!! $html !!} | afficher sans protection (jamais avec une saisie d'utilisateur) |
@if (...) … @elseif (...) … @else … @endif | condition |
@foreach ($livres as $livre) … @endforeach | boucle |
@forelse ($livres as $livre) … @empty … @endforelse | boucle + message si la liste est vide |
@csrf, @method('PUT') | formulaires (chapitres 3 et 5) |
@extends('layout'), @section('contenu') … @endsection, @yield('contenu') | mise en page commune (layout) |
@include('partials.menu') | insérer une autre vue |
{{-- commentaire --}} | commentaire invisible dans la page |
Leçon 2
La transmission des données aux vues
On passe un tableau de paires clé/valeur ; dans la vue, chaque clé est une variable, par exemple <?php echo $name; ?> ou {{ $name }} :
return view('greetings', ['name' => 'Victoria']);Ou bien, élément par élément, avec la méthode with (on peut l'enchaîner) :
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');Partager des données avec toutes les vues
Pour une donnée utile dans toutes les vues (nom du site, téléphone…), on utilise View::share dans la méthode boot d'un fournisseur de services, par exemple AppServiceProvider :
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
View::share('key', 'value');
}
}Leçon 3
Les compositeurs de vues
On les enregistre dans un fournisseur de services, par exemple un nouveau App\Providers\ViewServiceProvider, avec la méthode composer de la façade View. On peut ranger les classes de compositeurs dans un dossier app/View/Composers :
<?php
namespace App\Providers;
use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
// compositeur sous forme de classe
View::composer('profile', ProfileComposer::class);
// compositeur sous forme de fonction
View::composer('dashboard', function ($view) {
//
});
}
}À chaque affichage de la vue profile, Laravel exécute la méthode compose de ProfileComposer :
<?php
namespace App\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class ProfileComposer
{
protected $users;
public function __construct(UserRepository $users)
{
$this->users = $users; // fourni automatiquement par Laravel
}
public function compose(View $view)
{
$view->with('count', $this->users->count()); // la vue reçoit $count
}
}Plusieurs vues à la fois, ou toutes les vues avec * :
use App\Views\Composers\MultiComposer;
View::composer(['profile', 'dashboard'], MultiComposer::class);
View::composer('*', function ($view) {
//
});Les créateurs de vues
Un créateur de vue ressemble à un compositeur, mais il s'exécute tout de suite quand la vue est créée, au lieu d'attendre qu'elle soit affichée :
use App\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;
View::creator('profile', ProfileCreator::class);Vidéo · À regarder
FRDécouverte de Laravel 10 : Les composants blade
Grafikart · YouTube
Les composants Blade : créer des morceaux de vue réutilisables (une alerte, une carte) et un layout commun (9 minutes). C'est la façon moderne d'organiser les vues.
Leçon 4
L'optimisation des vues
Par défaut, les vues Blade sont compilées (transformées en PHP) à la demande. À chaque requête, Laravel vérifie si la version compilée existe et si la vue a été modifiée depuis ; si oui, il la recompile. Cette vérification prend un peu de temps. En production, on précompile toutes les vues :
php artisan view:cache # précompiler toutes les vues
php artisan view:clear # vider le cache des vuesTP · Les vues de Kitab
(1) Crée un layout layouts/app.blade.php (titre, menu, @yield('contenu'), pied de page). (2) Crée livres/index.blade.php qui hérite du layout (@extends) et affiche une liste de livres reçue du contrôleur, avec le message flashé du chapitre 8. (3) Modifie LivreController@index pour renvoyer cette vue avec trois livres (titre, prix). (4) Partage le nom « Kitab » avec toutes les vues (View::share) et affiche-le dans le pied de page. (5) Ajoute le compositeur du menu de l'exercice 9.3 et inclus le menu dans le layout.
Exercices
Choisis la bonne réponse
1Les vues sont rangées dans…
2L'extension d'une vue Blade est…
3
view('admin.profile')charge le fichier…4Dans
view('greeting', ['name' => 'Ali']), la vue reçoit la variable…5Pour partager une donnée avec toutes les vues, on utilise…
6Un compositeur de vue s'exécute…
7
{{ $texte }}protège contre…8La commande qui précompile les vues est…
Une vue avec une liste
Écris : (1) une route /auteurs qui envoie à la vue auteurs un tableau de trois noms ; (2) la vue auteurs.blade.php qui affiche les noms dans une liste <ul>, ou « Aucun auteur » si la liste est vide (@forelse).
Le compositeur du menu
Écris un compositeur (sous forme de fonction, dans AppServiceProvider) qui envoie à la vue partials.menu une variable $categories contenant ['Romans', 'Jeunesse', 'Histoire']. Écris la vue partials/menu.blade.php qui affiche ces catégories en liens.
L'essentiel du chapitre
À retenir
- Vue = fichier HTML
.blade.phpdansresources/views;view('nom', ['cle' => valeur])ouView::make; sous-dossiers en notation point (admin.profile) ;View::first,View::exists. - Blade :
{{ }}(protégé),{!! !!},@if,@foreach,@forelse/@empty,@extends,@section,@yield,@include,@csrf,@method. - Données : tableau ou
->with('cle', valeur); pour toutes les vues :View::sharedansboot(). - Compositeur :
View::composer('vue', Classe::class ou fonction), méthodecompose(View $view); plusieurs vues ou*. Créateur :View::creator(dès la création de la vue). - Optimisation :
php artisan view:cache/view:clear.