Passer au contenu principal

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.
php artisan make:controller UserController

Contrôleur de base

Une classe de contrôleur peut avoir plusieurs méthodes publiques qui répondent aux requêtes HTTP entrantes.
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\View\View;

class UserController extends Controller
{
    /**
     * Affiche le profil de l'utilisateur donné.
     */
    public function show(string $id): View
    {
        return view('user.profile', [
            'user' => User::findOrFail($id)
        ]);
    }
}
Une fois la classe et la méthode créées, vous définissez une route vers la méthode ainsi :
use App\Http\Controllers\UserController;

Route::get('/user/{id}', [UserController::class, 'show']);
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.
<?php

namespace App\Http\Controllers;

class ProvisionServer extends Controller
{
    /**
     * Provisionne un nouveau serveur web.
     */
    public function __invoke()
    {
        // ...
    }
}
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.
use App\Http\Controllers\ProvisionServer;

Route::post('/server', ProvisionServer::class);
L’option --invokable de la commande Artisan make:controller génère un contrôleur invocable.
php artisan make:controller ProvisionServer --invokable

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.
php artisan make:controller PhotoController --resource
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.
use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class);
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.
Verbe HTTPURIActionNom de la route
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy
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.
use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class)->only([
    'index', 'show'
]);

Route::resource('photos', PhotoController::class)->except([
    'create', 'store', 'update', 'destroy'
]);

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.
use App\Http\Controllers\PhotoController;

Route::apiResource('photos', PhotoController::class);

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.
<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * Crée une nouvelle instance de contrôleur.
     */
    public function __construct(
        protected UserRepository $users,
    ) {}
}

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.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Enregistre un nouvel utilisateur.
     */
    public function store(Request $request): RedirectResponse
    {
        $name = $request->name;

        // Sauvegarde de l'utilisateur...

        return redirect('/users');
    }
}
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 :
use App\Http\Controllers\UserController;

Route::put('/user/{id}', [UserController::class, 'update']);
Définissez la méthode comme suit pour typer Illuminate\Http\Request tout en accédant au paramètre id.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Met à jour l'utilisateur donné.
     */
    public function update(Request $request, string $id): RedirectResponse
    {
        // Mise à jour de l'utilisateur...

        return redirect('/users');
    }
}
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