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 FormationControllerCela 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 --resourceCela 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'));
}