
Etape 3 : Contrôleur pour gérer la logique des notes
Apprenez à générer et structurer un contrôleur Laravel pour encapsuler la logique de gestion des notes : lister, afficher, créer et stocker les notes.
Le rôle central des contrôleurs dans l'architecture MVC de Laravel
Après avoir défini nos modèles pour interagir avec la base de données et nos routes pour gérer les requêtes HTTP, il est temps de s'attaquer à la pièce maîtresse de la logique de notre application : le contrôleur. Dans le motif de conception MVC (Modèle-Vue-Contrôleur) qu'adopte Laravel, le contrôleur agit comme un intermédiaire. Il reçoit les requêtes transmises par le système de routage, interagit avec le modèle pour récupérer ou manipuler des données, et enfin, sélectionne une vue pour présenter la réponse à l'utilisateur.
Plutôt que de placer toute la logique de gestion des requêtes directement dans les closures de nos fichiers de routes (comme nous l'avons fait temporairement à l'étape précédente), les contrôleurs nous permettent d'organiser ce code de manière plus structurée et réutilisable. Chaque groupe de fonctionnalités liées (comme la gestion des notes) aura typiquement son propre contrôleur.
Pour notre mini-gestionnaire de notes, nous allons créer un NoteController. Ce contrôleur contiendra des méthodes distinctes pour chaque action que nous avons définie : lister les notes, afficher une note spécifique, afficher le formulaire de création, et stocker une nouvelle note. L'utilisation d'un contrôleur rendra notre code plus clair, plus facile à maintenir et à tester.
Génération du `NoteController` avec Artisan
Comme pour les modèles et les migrations, Laravel Artisan nous simplifie la vie pour la création des contrôleurs. Pour générer notre NoteController, nous utiliserons la commande make:controller dans notre terminal, à la racine du projet :
php artisan make:controller NoteControllerCette commande va créer un nouveau fichier NoteController.php dans le répertoire app/Http/Controllers/. Par défaut, ce contrôleur sera vide, contenant simplement la structure de base d'une classe contrôleur :
Si nous avions voulu créer un contrôleur avec des méthodes pré-remplies pour les opérations CRUD typiques (index, create, store, show, edit, update, destroy), nous aurions pu utiliser l'option --resource :
php artisan make:controller NoteController --resourcePour notre projet actuel, nous allons créer les méthodes nécessaires manuellement pour mieux comprendre leur rôle. Les méthodes que nous allons implémenter correspondent aux actions que nous avons définies :
index(): Pour lister toutes les notes.show($id): Pour afficher une note spécifique.create(): Pour afficher le formulaire de création d'une nouvelle note.store(Request $request): Pour traiter les données du formulaire soumis et enregistrer la nouvelle note.
Implémentation des méthodes du `NoteController`
Ouvrons le fichier app/Http/Controllers/NoteController.php et ajoutons les méthodes pour gérer nos notes. Nous commencerons par importer notre modèle Note en haut du fichier.
Quelques remarques sur ces méthodes :
- La méthode
indexcorrespondra à la route qui liste toutes les notes. - La méthode
createaffichera le formulaire. - La méthode
store, qui prend un objetIlluminate\Http\Requesten argument, sera responsable de la validation et de la sauvegarde des données du formulaire. L'objet$requestpermet d'accéder aux données soumises par l'utilisateur. - La méthode
showprendra un$iden argument (qui viendra du paramètre de route) pour afficher une note spécifique. Nous avons typé l'argument$idenstringcar les paramètres de route sont initialement des chaînes. Laravel est assez flexible, mais si vous utilisez le Route Model Binding (que nous verrons plus tard), vous typerez souvent directement avec le nom du modèle (par exemple,public function show(Note $note)).
Pour l'instant, ces méthodes retournent de simples chaînes de caractères. A l'étape suivante, lorsque nous créerons les vues Blade, ces méthodes retourneront des vues avec les données appropriées.
Mise à jour du fichier de routes pour utiliser le `NoteController`
Maintenant que notre NoteController est prêt avec ses méthodes de base, nous devons mettre à jour notre fichier routes/web.php pour que nos routes appellent ces méthodes au lieu des fonctions anonymes (closures) que nous avions utilisées temporairement.
Modifiez votre fichier routes/web.php comme suit :
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\NoteController; // Important : Importer le contrôleur
Route::get('/', function () {
return view('welcome');
});
// Routes pour les notes gérées par NoteController
Route::get('/notes', [NoteController::class, 'index'])->name('notes.index');
Route::get('/notes/creer', [NoteController::class, 'create'])->name('notes.create');
Route::post('/notes', [NoteController::class, 'store'])->name('notes.store');
Route::get('/notes/{note}', [NoteController::class, 'show'])->name('notes.show')->where('note', '[0-9]+');
// Note: J'ai utilisé {note} comme nom de paramètre pour la route show, ce qui est une bonne pratique,
// surtout si on envisage le Route Model Binding. Le contrôleur devra aussi utiliser $note.
N'oubliez pas d'ajouter use App\Http\Controllers\NoteController; en haut de votre fichier routes/web.php pour pouvoir référencer la classe NoteController.
La syntaxe [NoteController::class, 'methodName'] est la manière standard et recommandée depuis Laravel 8 pour spécifier l'action d'un contrôleur. Elle offre une meilleure prise en charge par les IDEs (auto-complétion, refactoring).
Si vous avez utilisé {note} comme paramètre dans la route notes.show, assurez-vous que votre méthode show dans NoteController attend également un paramètre nommé $note :
// Dans app/Http/Controllers/NoteController.php
// ...
public function show(string $note) // Le nom du paramètre doit correspondre à celui de la route
{
return 'Méthode show du NoteController : Affiche la note avec l’ID ' . $note;
}
// ...
Après ces modifications, si vous visitez /notes dans votre navigateur, vous devriez voir le message "Méthode index du NoteController : Liste des notes". De même pour les autres routes, qui devraient afficher les messages correspondants définis dans les méthodes du contrôleur. Cela confirme que notre routage est correctement configuré pour utiliser le NoteController.
Nous avons maintenant une structure solide : les requêtes arrivent aux routes, qui les dirigent vers les méthodes appropriées de notre NoteController. La prochaine étape sera de faire en sorte que ces méthodes interagissent avec notre modèle Note pour manipuler les données et retournent des vues Blade pour les afficher à l'utilisateur.