Chapitre 8Projet SunuLearn

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';
}