Skip to main content

Qu’est-ce qu’un contrôleur

Au lieu de définir toute la logique de traitement des requêtes dans des closures dans les fichiers de routes, vous pouvez organiser ce comportement dans des classes « contrôleurs ». Un contrôleur regroupe la logique de traitement des requêtes liées dans une seule classe. Par exemple, la classe UserController peut gérer toutes les requêtes concernant les utilisateurs (affichage, création, mise à jour, suppression, etc.). Par défaut, les contrôleurs sont stockés dans le répertoire app/Http/Controllers.

Création d’un contrôleur

Pour générer rapidement un nouveau contrôleur, utilisez la commande Artisan make:controller. Tous les contrôleurs sont stockés par défaut dans app/Http/Controllers.

Contrôleur de base

Une classe de contrôleur peut avoir plusieurs méthodes publiques qui répondent aux requêtes HTTP entrantes.
Une fois la classe et la méthode créées, vous définissez une route vers la méthode ainsi :
Lorsque la requête entrante correspond à l’URI spécifié, la méthode show de la classe App\Http\Controllers\UserController est appelée avec les paramètres de route en argument.
Les contrôleurs n’ont pas besoin d’hériter d’une classe de base. Toutefois, il peut être utile d’hériter d’une classe de base commune contenant des méthodes partagées par tous les contrôleurs.

Contrôleurs à action unique

Si l’action d’un contrôleur est particulièrement complexe, il peut être pratique de dédier toute la classe à cette unique action. Définissez pour cela une méthode __invoke dans le contrôleur.
Pour enregistrer une route vers un contrôleur à action unique, il n’est pas nécessaire de préciser une méthode. Passez simplement le nom du contrôleur au routeur.
L’option --invokable de la commande Artisan make:controller génère un contrôleur invocable.

Contrôleurs de ressource

Si l’on considère chaque modèle Eloquent comme une « ressource », il est courant d’exécuter les mêmes opérations (CRUD) sur chacune. Le routage de ressource Laravel affecte les routes typiques create / read / update / delete à un contrôleur en une seule ligne. L’option --resource de la commande Artisan make:controller crée rapidement un contrôleur gérant ces actions.
Cette commande génère app/Http/Controllers/PhotoController.php avec un stub pour chaque opération de ressource. Enregistrez ensuite une route de ressource pointant vers le contrôleur.
Cette déclaration en une ligne crée plusieurs routes gérant diverses actions sur la ressource. Le contrôleur généré contient déjà un stub pour chacune.
La commande php artisan route:list affiche un aperçu rapide des routes de l’application.

Routes de ressource partielles

Lors de la déclaration d’une route de ressource, vous pouvez restreindre le sous-ensemble d’actions gérées par le contrôleur.

Routes de ressource API

Pour une API, on veut souvent exclure les routes qui affichent des templates HTML (create, edit). La méthode apiResource exclut automatiquement ces deux routes.

Injection de dépendances

Injection dans le constructeur

Le conteneur de services Laravel est utilisé pour résoudre les dépendances de tous les contrôleurs. Vous pouvez donc typer les dépendances requises dans le constructeur. Elles seront résolues automatiquement et injectées dans l’instance.

Injection dans la méthode

En plus du constructeur, vous pouvez également typer des dépendances dans les méthodes. Un cas courant est l’injection d’une instance Illuminate\Http\Request.
Si la méthode reçoit également des paramètres de route, listez-les après les dépendances. Par exemple, avec la route suivante :
Définissez la méthode comme suit pour typer Illuminate\Http\Request tout en accédant au paramètre id.
L’injection de dépendances facilite l’injection de mocks lors des tests, améliorant la testabilité du code.

Prochaines étapes

Routage

Revenez sur la définition des routes et leur lien avec les contrôleurs.
Dernière modification le 13 juillet 2026