Les modèles dans Laravel 12 : Premières étapes
Bienvenue dans ce quatrième épisode de notre série sur Laravel 12 ! 🚀 Aujourd'hui, nous allons découvrir les modèles et comprendre comment ils s'intègrent dans l'architecture MVC de Laravel.
Introduction
Les modèles représentent le "M" dans l'architecture MVC (Modèle-Vue-Contrôleur) utilisée par Laravel. Ils sont responsables de la gestion des données et de la logique métier de votre application.
Dans cette vidéo, nous allons prendre une approche progressive :
- Comprendre le problème de duplication de code dans nos routes
- Créer un modèle simple en PHP pur pour encapsuler notre logique
- Préparer le terrain pour la prochaine vidéo où nous utiliserons les modèles Eloquent de Laravel
📌 Au programme :
- ✅ Comprendre le rôle des modèles dans l'architecture MVC
- ✅ Refactoriser notre code pour éviter la duplication
- ✅ Créer un modèle simple pour gérer nos recettes
- ✅ Implémenter des méthodes de récupération de données
Le problème de la duplication de code
Dans notre vidéo précédente, nous avons créé deux routes avec le même tableau de recettes :
Route::get('/recipes', function () {
$recipes = [
1 => ['title' => 'Spaghetti Carbonara', 'ingredients' => ['Pâtes', 'Oeufs', 'Fromage', 'Lardons']],
2 => ['title' => 'Poulet Curry', 'ingredients' => ['Poulet', 'Lait de coco', 'Curry']],
3 => ['title' => 'Sauté de légumes', 'ingredients' => ['Brocoli', 'Carottes', 'Sauce soja', 'Ail']]
];
return view('recipes.index', compact('recipes'));
});
Route::get('/recipe/{id}', function ($id) {
$recipes = [
1 => ['title' => 'Spaghetti Carbonara', 'ingredients' => ['Pâtes', 'Oeufs', 'Fromage', 'Lardons']],
2 => ['title' => 'Poulet Curry', 'ingredients' => ['Poulet', 'Lait de coco', 'Curry']],
3 => ['title' => 'Sauté de légumes', 'ingredients' => ['Brocoli', 'Carottes', 'Sauce soja', 'Ail']]
];
$recipe = Arr::get($recipes, $id, ['title' => 'Recette non trouvée', 'ingredients' => []]);
return view('recipes.show', compact('recipe'));
});
Cette duplication crée deux sources de vérité identiques, ce qui n'est pas optimal. Normalement, ces données devraient être stockées en base de données et accessibles via un modèle.
Première étape : Refactoriser notre code
Commençons par éviter la duplication en déplaçant notre tableau de recettes en dehors des routes :
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Arr;
$recipes = [
1 => ['title' => 'Spaghetti Carbonara', 'ingredients' => ['Pâtes', 'Oeufs', 'Fromage', 'Lardons']],
2 => ['title' => 'Poulet Curry', 'ingredients' => ['Poulet', 'Lait de coco', 'Curry']],
3 => ['title' => 'Sauté de légumes', 'ingredients' => ['Brocoli', 'Carottes', 'Sauce soja', 'Ail']]
];
Route::get('/recipes', function () use ($recipes) {
return view('recipes.index', compact('recipes'));
});
Route::get('/recipe/{id}', function ($id) use ($recipes) {
$recipe = Arr::get($recipes, $id, ['title' => 'Recette non trouvée', 'ingredients' => []]);
return view('recipes.show', compact('recipe'));
});
Nous pouvons aussi utiliser les fonctions fléchées, mais attention à la lisibilité :
Route::get('/recipes', fn() => view('recipes.index', compact('recipes')));
Création d'un modèle simple
L'étape suivante consiste à créer un modèle pour encapsuler la logique d'accès aux données. Dans le dossier app/Models
, créons un fichier Recipe.php
:
<?php
namespace App\Models;
use Illuminate\Support\Arr;
class Recipe
{
public function getAll(): array
{
return [
1 => ['title' => 'Spaghetti Carbonara', 'ingredients' => ['Pâtes', 'Oeufs', 'Fromage', 'Lardons']],
2 => ['title' => 'Poulet Curry', 'ingredients' => ['Poulet', 'Lait de coco', 'Curry']],
3 => ['title' => 'Sauté de légumes', 'ingredients' => ['Brocoli', 'Carottes', 'Sauce soja', 'Ail']]
];
}
public function retrieve(int $id): array
{
$recipes = $this->getAll();
return Arr::get($recipes, $id, ['title' => 'Recette non trouvée', 'ingredients' => []]);
}
}
Notre modèle Recipe
encapsule désormais :
- Une méthode
getAll()
qui retourne toutes les recettes - Une méthode
retrieve(int $id)
qui retourne une recette spécifique par son ID
Utilisation du modèle dans nos routes
Maintenant, nous pouvons modifier nos routes pour utiliser notre modèle :
use App\Models\Recipe;
Route::get('/recipes', function () {
$model = new Recipe();
$recipes = $model->getAll();
return view('recipes.index', compact('recipes'));
});
Route::get('/recipe/{id}', function ($id) {
$model = new Recipe();
$recipe = $model->retrieve($id);
return view('recipes.show', compact('recipe'));
});
Bonus : Correction du menu actif
Dans notre layout, nous voulons que le lien "Recettes" reste actif même quand on affiche une recette spécifique. Pour cela, nous pouvons utiliser la fonction fnmatch
:
<x-link-item href="/recipes" :active="fnmatch('recipes.*', Route::currentRouteName()) ? true : false">Recipes</x-link-item>
Conclusion
Dans cet épisode, nous avons :
- Compris le rôle des modèles dans l'architecture MVC
- Refactorisé notre code pour éviter la duplication
- Créé un modèle simple pour gérer nos recettes
- Encapsulé la logique d'accès aux données dans notre modèle
👉 Dans le prochain épisode, nous découvrirons les modèles Eloquent de Laravel et comment les utiliser pour interagir avec une base de données !
Vidéos de la playlist
Premiers pas et structure de Laravel 12
Les vues avec Blade et TailwindCSS
Passer des données aux vues
Le M dans MVC
Les migrations dans Laravel 12
Eloquent dans Laravel 12
Relations HasMany/BelongsTo dans Laravel 12
Réservez une session de mentorat personnalisée pour accélérer votre apprentissage et résoudre vos problèmes techniques.
Réserver une session de mentorat