4.2 · Laravel : routes, Blade, Eloquent (ORM), migrations

Niveau 4 · Frameworks & API

4.2Laravel : routes, Blade, Eloquent (ORM), migrations

Objectif : Construire avec Laravel (routage, contrôleurs, vues Blade, ORM Eloquent, migrations) — des applications structurées, productives et sûres, le cœur du PHP professionnel actuel.
Temps estimé : 13 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • Routage + contrôleurs : Route::get('/produits', [ProduitController::class, 'index']) dirige l'URL vers l'action ; Artisan génère le code.
  • Blade + Eloquent : templates {{ }} avec échappement auto (anti-XSS), et base manipulée en objets (Produit::where(...)->get()) avec requêtes préparées auto.
  • Réflexe de Riad : versionner la base en migrations et comprendre le SQL généré (attention au N+1) au lieu de subir l'ORM.

Mini-cas filé — Riad passe son catalogue sous Laravel

Le catalogue MVC de Riad (4.1) grandit : il le porte sous Laravel à Constantine. Il déclare ses routes vers un ProduitController, affiche avec une vue Blade qui échappe par défaut, lit la base via Eloquent sans écrire de SQL, et décrit la table produits dans une migration versionnée avec Git. Quand un collègue récupère le projet, une commande installe, une autre migre — et la base est identique. Deuxième jalon du fil rouge : productif, structuré et sûr par défaut.

Suite du cas 4.1 — Riad industrialise son MVC avec un framework.

1. Routage, contrôleurs, Artisan

Laravel implémente le MVC avec des outils élégants. Le routage associe URL et actions : Route::get('/produits', [ProduitController::class, 'index']) envoie les GET vers la méthode index — expressif (GET/POST, paramètres, groupes, middlewares). Les contrôleurs traitent les requêtes (reçoivent, appellent les modèles, retournent vue ou réponse). La ligne de commande Artisan génère contrôleurs et modèles, lance les migrations : Riad scaffolde en secondes au lieu de copier-coller.

2. Blade : les vues sûres

Blade est le moteur de templates : {{ $variable }} pour afficher, @foreach et @if pour la logique d'affichage, layouts réutilisables par héritage. Son atout majeur : l'échappement automatique — les données sont échappées par défaut, ce qui protège du XSS sans y penser. Riad remplace son mélange PHP/HTML brut par des templates lisibles et sûrs.

3. Eloquent et migrations : les données

Eloquent est l'ORM : les tables deviennent des classes, les lignes des objets — Produit::all(), Produit::find($id), Produit::where('prix', '>', 100)->get(), $produit->save() — avec requêtes préparées automatiques (anti-injection) et relations élégantes. Les migrations versionnent la structure de la base en code PHP : reproductible, traçable, essentielle en équipe et au déploiement. Riad retient deux vigilances : comprendre le SQL généré et éviter le N+1 par eager loading (with()). Laravel ajoute auth, validation, CSRF auto, sessions sécurisées : un excellent investissement, framework le plus demandé.

Erreur d'interprétation fréquente : « Avec Eloquent, je n'ai plus besoin de connaître le SQL ». Non. L'ORM écrit du SQL à votre place — mais un mauvais usage génère des requêtes catastrophiques (le N+1 : une requête par élément d'une liste au lieu d'une seule) que seul un œil qui comprend le SQL détecte. Eloquent rend productif celui qui connaît les bases SQL ; il rend dangereusement confiant celui qui les ignore.
Le circuit Laravel d'une page Route → contrôleur → Eloquent → Blade Route URL vers l'actiondu contrôleurContrôleur Reçoit,appelle le modèleEloquent Objets, requêtespréparées autoBlade + migration Vueéchappée, base versionnée
Route → contrôleur → Eloquent → Blade
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Riad déclare ses routes vers les actions du contrôleur. 2) Le contrôleur appelle Eloquent, qui manipule la base en objets avec requêtes préparées. 3) La vue Blade affiche avec échappement automatique. 4) La structure de la base vit en migrations versionnées. Leçon : productivité + sécurité par défaut, sans magie incomprise.

🔎 Exemple concret — 🔎 Exemple concret — Catalogue produits sous Laravel

Les quatre gestes de Riad, avec les API réelles :

Route::get('/produits', [ProduitController::class, 'index']);
$produits = Produit::where('prix', '>', 100)->get(); // all(), find($id)
return view('produits.index', ['produits' => $produits]);
Blade : {{ $p->nom }} + @foreach ($produits as $p) ... @endforeach

Lecture : route, requête objet, vue, template — chacun à sa place.

Leçon : le framework applique le MVC et la sécurité par défaut.

Vocabulaire de la section

Laravel
Le framework PHP le plus populaire (élégant, productif, vaste écosystème) ; implémente le MVC avec les bonnes pratiques. La référence du PHP moderne.

Exemple simple : Riad y porte son catalogue pour aller vite sans sacrifier la structure.

Ce que ce n'est pas : un empilement de scripts sans routage ni ORM.

Réflexe : penser routes, contrôleurs, Blade, Eloquent, migrations.

Routage / contrôleurs / Artisan
Routage : URL → actions (Route::get). Contrôleurs : traitent les requêtes. Artisan : CLI qui génère du code et lance les migrations.

Exemple simple : La route /produits de Riad pointe vers ProduitController@index, généré par Artisan.

Ce que ce n'est pas : un fichier PHP par URL bricolé à la main.

Réflexe : une URL = une route nommée vers une action claire.

Blade (templates)
Moteur de templates Laravel : {{ }}, @foreach, @if, layouts — avec ÉCHAPPEMENT AUTOMATIQUE (anti-XSS par défaut).

Exemple simple : Riad affiche {{ $p->nom }} sans craindre l'injection de HTML.

Ce que ce n'est pas : des echo PHP entremêlés au HTML sans échappement.

Réflexe : {{ }} par défaut ; {!! !!} seulement en connaissance de cause.

Eloquent (ORM)
ORM Laravel : tables ↔ classes, lignes ↔ objets ; base manipulée en objets/méthodes, requêtes préparées auto, relations élégantes.

Exemple simple : Riad lit Produit::where('prix', '>', 100)->get() au lieu d'écrire le SELECT.

Ce que ce n'est pas : du SQL concaténé avec des variables non échappées.

Réflexe : vérifier le SQL généré et chasser le N+1 avec with().

Migrations
Structure de la base versionnée en code PHP (avec Git) : reproductible, traçable — essentielle en équipe et au déploiement.

Exemple simple : La table produits de Riad naît d'une migration, rejouée partout à l'identique.

Ce que ce n'est pas : des ALTER TABLE faits à la main en production.

Réflexe : jamais de structure modifiée hors migration.

En pratique — En pratique — Construire avec Laravel

  1. Créez un projet Laravel (via Composer), explorez routes, contrôleurs, modèles, vues Blade et la CLI Artisan.
  2. Définissez des routes (Route::get/post) vers des contrôleurs ; créez une vue Blade avec {{ }} et @foreach (échappement automatique).
  3. Utilisez Eloquent : modèle + CRUD en objets (all/find/where/save) sans SQL, requêtes préparées automatiques.
  4. Créez une migration pour versionner une table ; activez l'auth, la validation et la protection CSRF fournies.
Vous construisez des applications modernes avec Laravel (routage, Blade, Eloquent, migrations) — structurées, productives et sûres.

Script prêt à dire — défendre le passage à Laravel (30 s)

« C'est Riad : sous Laravel, nos routes sont explicites, nos vues Blade échappent par défaut, Eloquent prépare nos requêtes et nos migrations versionnent la base. On livre plus vite, avec la sécurité intégrée au lieu de la bricoler. »

À dire en point technique ; montrez route + Blade + migration.

Modèle copier-coller — CRUD Laravel (code testé)

', 100)->get();
        return view('produits.index', ['produits' => $produits]);
    }
    public function store(Request $request) {
        $valide = $request->validate(['nom' => 'required|string|max:255', 'prix' => 'required|numeric|min:0']);
        $produit = Produit::create($valide);
        return response()->json($produit, 201);
    }
}

// resources/views/produits/index.blade.php
// @foreach ($produits as $p) 
  • {{ $p->nom }} — {{ $p->prix }} DA
  • @endforeach // database/migrations/xxxx_create_produits_table.php (extrait) // Schema::create('produits', function (Blueprint $t) { // $t->id(); $t->string('nom'); $t->decimal('prix', 10, 2); $t->timestamps(); // });

    Petit site vitrine

    Routes + Blade suffisent : gardez Eloquent pour ce qui mérite une base, sans sur-modéliser.

    Application réelle

    Comme Riad : routes nommées, contrôleurs ressources, Eloquent avec eager loading, tout en migrations.

    Liste qui rame (N+1)

    Chargez les relations en une fois (with('categorie')) : une requête au lieu d'une par ligne.

    Équipe qui débute

    Interdisez le SQL concaténé et le HTML non échappé : le framework fait déjà les deux.

    Prudence : Productif ne veut pas dire exposé : validez toute entrée (validate()), laissez Blade échapper par défaut et rangez les secrets en .env, jamais en dur. Contenu pédagogique, exemples avec données fictives.

    ✓ Bonnes pratiques

    • Respecter le MVC imposé par le framework.
    • Comprendre le SQL généré par Eloquent.
    • Versionner la base en migrations.

    ✗ Pièges fréquents

    • Mettre de la logique dans les templates Blade.
    • Ignorer le N+1 (ORM boîte noire).
    • Recoder auth/validation/CSRF déjà fournis.

    Points clés à retenir

    • LARAVEL = framework PHP le plus POPULAIRE : MVC, productivité, sécurité intégrée. La référence.
    • ROUTAGE (Route::get → actions), CONTRÔLEURS, ARTISAN (générer, migrer).
    • BLADE : {{ }}, @foreach, ÉCHAPPEMENT AUTO (anti-XSS). ELOQUENT : objets au lieu de SQL, préparées auto, relations.
    • MIGRATIONS : base versionnée = reproductible et traçable. Plus auth, validation, CSRF auto.

    Défi 48h — appliquez demain

    Shippez 1 ressource CRUD sous Laravel : 2 routes + 1 vue Blade + Eloquent + 1 migration, sans une ligne de SQL à la main.

    Checklist sortie de section
    • Je peux citer routes, Blade, Eloquent, migrations.
    • Je sais expliquer l'échappement auto et les préparées auto.
    • J'ai 1 CRUD Laravel qui tourne.
    Auto-évaluation 1-5 : mes vues échappent-elles par défaut ?ma base est-elle entièrement en migrations ?

    Questions fréquentes

    Qu'apporte un framework comme Laravel par rapport à du PHP « à la main » ?

    Structure MVC imposée (fini le spaghetti), productivité (ORM, templates, routage, Artisan, dizaines de fonctionnalités prêtes), sécurité intégrée par défaut (échappement Blade anti-XSS, préparées Eloquent anti-injection, CSRF auto, hachage, auth robuste) et fonctionnalités éprouvées (auth, validation, sessions, mails, files, tests, migrations). On construit des applications complètes bien plus vite, avec moins d'erreurs — d'où son statut d'incontournable pro.

    Qu'est-ce qu'un ORM comme Eloquent — et faut-il quand même connaître le SQL ?

    Un ORM mappe objets ↔ tables (tables ↔ classes, lignes ↔ objets, colonnes ↔ propriétés) : Produit::all() au lieu de SELECT *. Apports : productivité, sécurité (préparées auto), lisibilité, relations élégantes ($utilisateur->commandes). Mais OUI, le SQL reste indispensable : pour comprendre et optimiser ce que l'ORM génère (N+1, index, jointures) et pour les requêtes complexes. Eloquent + bases SQL = le bon duo.

    Vérifiez votre compréhension

    Qu'apporte Eloquent par rapport à du SQL écrit à la main ?

    Ressources supplémentaires (optionnel, pour aller plus loin)

    Examen du niveau 4Questions inédites et durcies pour valider vos acquis