Afficher les données dynamiques
Passer les données aux vues, pagination et recherche
Concepts Théoriques
Jusqu'ici, les contrôleurs retournaient des données en dur (des tableaux PHP). Maintenant qu'Eloquent et les seeders ont rempli la base, nous allons connecter les contrôleurs aux modèles pour afficher les vraies données.
Le principe est simple : le contrôleur demande les données à Eloquent, et les passe à la vue Blade. La vue ne fait jamais de requêtes SQL — elle reçoit des données prêtes à afficher.
Remplacer les données en dur
Avant (ch.2) :
public function index()
{
$formations = [['title' => 'HTML', ...]]; // En dur
return view('formations.index', compact('formations'));
}Après :
public function index()
{
$formations = Formation::published()
->with('category')
->orderBy('order')
->get();
return view('formations.index', compact('formations'));
}Le with('category') est l'eager loading — il charge les catégories en une seule requête au lieu d'une par formation.
Pagination
Sur un gros catalogue, afficher 200 formations d'un coup est lent. La pagination découpe en pages :
$formations = Formation::published()->paginate(12);Dans Blade :
@foreach ($formations as $formation)
...
@endforeach
{{ $formations->links() }} {{-- Affiche les liens de pagination --}}paginate(12) retourne 12 formations par page. links() génère automatiquement les boutons "Précédent / 1 / 2 / 3 / Suivant".
Filtrage par catégorie
public function index(Request $request)
{
$query = Formation::published()->with('category');
if ($request->filled('category')) {
$query->whereHas('category', function ($q) use ($request) {
$q->where('slug', $request->category);
});
}
$formations = $query->orderBy('order')->paginate(12);
$categories = Category::active()->orderBy('order')->get();
return view('formations.index', compact('formations', 'categories'));
}whereHas() filtre les formations par une condition sur la relation catégorie. L'URL /formations?category=backend affiche seulement les formations de la catégorie Backend.
Route Model Binding
Au lieu de chercher manuellement par slug :
// Avant
public function show(string $slug)
{
$formation = Formation::where('slug', $slug)->firstOrFail();
}
// Après — Route Model Binding
public function show(Formation $formation)
{
// Laravel trouve automatiquement la formation par son id ou slug
return view('formations.show', compact('formation'));
}Pour utiliser le slug au lieu de l'id, ajoutez dans le modèle :
public function getRouteKeyName(): string
{
return 'slug';
}