Chapitre 2Projet SunuLearn

Les contrôleurs — organiser la logique

Controllers, injection de dépendances et resource controllers

Concepts Théoriques

Au chapitre 1, nous avons mis la logique directement dans les routes (les fonctions anonymes). Ça fonctionne pour des exemples simples, mais sur un vrai projet avec 50 routes, le fichier web.php deviendrait illisible. Les contrôleurs séparent la logique dans des classes PHP dédiées.

Le principe MVC : le Modèle gère les données (Eloquent, chapitre 5), la Vue affiche le HTML (Blade, chapitre 3), le Contrôleur reçoit la requête et orchestre la réponse. Le contrôleur est le chef d'orchestre — il demande les données au modèle et les passe à la vue.

Créer un contrôleur

php artisan make:controller FormationController

Cela crée app/Http/Controllers/FormationController.php :

namespace App\Http\Controllers;

class FormationController extends Controller
{
    //
}

Connecter le contrôleur aux routes

// routes/web.php
use App\Http\Controllers\FormationController;

Route::get('/formations', [FormationController::class, 'index'])->name('formations.index');
Route::get('/formations/{slug}', [FormationController::class, 'show'])->name('formations.show');

La syntaxe [Classe::class, 'méthode'] dit : "quand cette URL est visitée, appelle cette méthode de cette classe".

Resource controller — les 7 méthodes CRUD

Laravel a une convention pour les contrôleurs qui gèrent un CRUD complet :

php artisan make:controller FormationController --resource

Cela génère automatiquement 7 méthodes :

Méthode URL Verbe HTTP Usage
index() /formations GET Liste
create() /formations/create GET Formulaire de création
store() /formations POST Enregistrer
show($id) /formations/{id} GET Détail
edit($id) /formations/{id}/edit GET Formulaire d'édition
update($id) /formations/{id} PUT Mettre à jour
destroy($id) /formations/{id} DELETE Supprimer

Et une seule ligne de route remplace les 7 :

Route::resource('formations', FormationController::class);

Passer des données à la vue

Le contrôleur récupère les données et les envoie à la vue :

public function index()
{
    $formations = [
        ['title' => 'HTML, CSS, JavaScript', 'level' => 'Débutant', 'chapters' => 19],
        ['title' => 'PHP', 'level' => 'Débutant', 'chapters' => 16],
        ['title' => 'Laravel 12', 'level' => 'Intermédiaire', 'chapters' => 17],
    ];

    return view('formations.index', compact('formations'));
}

compact('formations') est un raccourci pour ['formations' => $formations].

Injection de la requête

Laravel injecte automatiquement l'objet Request dans vos méthodes :

use Illuminate\Http\Request;

public function index(Request $request)
{
    $search = $request->query('q');       // ?q=laravel
    $category = $request->query('cat');   // ?cat=backend
    
    return view('formations.index', compact('search', 'category'));
}