Routing & Controllers
Thème :
Junior
10 vues ·4/9 leçons

Introduction aux Contrôleurs

Les contrôleurs (controllers) regroupent la logique de traitement des requêtes associées au sein d’une seule classe. Au lieu de définir toute votre logique dans des fonctions anonymes (closures) de routes, les contrôleurs vous aident à organiser votre application.

Pourquoi utiliser des Contrôleurs ?

// ❌ Les fonctions anonymes dans les routes fonctionnent, mais deviennent vite ingérables
Route::get('/users', function () {
    $users = User::all();
    // 50 lignes de logique métier...
    return view('users.index', compact('users'));
});

Route::post('/users', function (Request $request) {
    // Encore 50 lignes de plus...
});

// ✅ Les contrôleurs organisent la logique de façon structurée
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);

Créer des Contrôleurs

Utilisez la commande Artisan pour générer des contrôleurs :

# Contrôleur basique
php artisan make:controller UserController

# Contrôleur de ressources (avec les méthodes CRUD complètes)
php artisan make:controller PostController --resource

# Contrôleur de ressources pour API (sans les méthodes create/edit qui renvoient des vues)
php artisan make:controller API/ProductController --api

# Contrôleur à action unique (invokable)
php artisan make:controller ShowProfile --invokable

Structure de Base d’un Contrôleur

<?php

namespace App\Http\Controllers;

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

class UserController extends Controller
{
    /**
     * Affiche une liste des utilisateurs.
     */
    public function index(): View
    {
        $users = User::all();

        return view('users.index', ['users' => $users]);
    }

    /**
     * Affiche l'utilisateur spécifié.
     */
    public function show(User $user): View
    {
        return view('users.show', ['user' => $user]);
    }

    /**
     * Enregistre un nouvel utilisateur.
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
        ]);

        $user = User::create($validated);

        return redirect()->route('users.show', $user);
    }
}

Définir des Routes pointant vers des Contrôleurs

use App\Http\Controllers\UserController;

// Méthode unique
Route::get('/users', [UserController::class, 'index']);

// Plusieurs méthodes avec routes nommées
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/{user}', [UserController::class, 'show'])->name('users.show');
Route::post('/users', [UserController::class, 'store'])->name('users.store');

Contrôleurs à Action Unique (Invokable)

Pour les contrôleurs qui n’ont qu’une seule action, utilisez la méthode magique __invoke :

<?php

namespace App\Http\Controllers;

class ShowProfile extends Controller
{
    /**
     * Gère la requête entrante.
     */
    public function __invoke(Request $request)
    {
        return view('profile', [
            'user' => $request->user(),
        ]);
    }
}

La définition de la route devient beaucoup plus simple :

// Pas besoin de spécifier le nom d'une méthode !
Route::get('/profile', ShowProfile::class);

L’Injection de Dépendances

Le conteneur de services (service container) de Laravel résout automatiquement les dépendances de vos contrôleurs :

<?php

namespace App\Http\Controllers;

use App\Services\UserService;

class UserController extends Controller
{
    /**
     * Injection via le constructeur
     */
    public function __construct(
        private UserService $userService
    ) {}

    public function index()
    {
        $users = $this->userService->getAllActive();

        return view('users.index', ['users' => $users]);
    }

    /**
     * Injection via une méthode
     */
    public function store(Request $request, UserService $service)
    {
        $user = $service->create($request->validated());

        return redirect()->route('users.show', $user);
    }
}

Middleware dans les Contrôleurs

Vous pouvez appliquer des middlewares à toutes les méthodes d’un contrôleur ou seulement à certaines :

// Dans le fichier des routes
Route::get('/dashboard', [DashboardController::class, 'index'])
    ->middleware('auth');

// Dans le constructeur du contrôleur (façon classique)
class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth'); // Appliqué à toutes les méthodes
        $this->middleware('admin')->only('destroy'); // Seulement la méthode destroy
        $this->middleware('throttle:60,1')->except(['index', 'show']); // Toutes sauf index et show
    }
}

// Approche moderne : utiliser les attributs PHP (PHP 8+)
#[Middleware('auth')]
class UserController extends Controller
{
    // Toutes les méthodes nécessitent d'être authentifié
}

Ressources

  • Contrôleurs — Documentation officielle de Laravel sur les contrôleurs

📘 Cette leçon fait partie du cours Routage & Contrôleurs Laravel sur la plateforme d’apprentissage RostoDev.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Introduction aux Contrôleurs. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.