Aller au contenu
Framework côté serveur

Controllers

Les Controllers

Les controllers sont au cœur du traitement logique d'une application web. Ils interceptent les requêtes entrantes, communiquent avec les modèles et renvoient des réponses sous forme de vues ou de données JSON (dans le cas des API).

Exemple de Controller simple

Prenons un exemple concret d'un controller qui affiche une liste de tâches :

Déclaration de la route

// routes/web.php

use App\Http\Controllers\TaskController;

Route::get('/tasks', [TaskController::class, 'index']);

Création du Controller

// app/Http/Controllers/TaskController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        // Simulons des tâches pour l'exemple
        $tasks = [
            ['id' => 1, 'title' => 'Acheter du café'],
            ['id' => 2, 'title' => 'Coder comme un boss'],
            ['id' => 3, 'title' => 'Faire une pause (ou pas)'],
        ];

        return view('tasks.index', compact('tasks'));
    }
}

Vue associée

<!-- resources/views/tasks/index.blade.php -->

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Liste des tâches</title>
</head>
<body>
    <h1>Tâches à accomplir</h1>
    <ul>
        @foreach($tasks as $task)
            <li>{{ $task['title'] }}</li>
        @endforeach
    </ul>
</body>
</html>

Ici, le controller récupère des tâches fictives (aucune base de données pour l’instant) et les envoie à la vue pour affichage.

Controller Resource : exemple avec une ressource "User"

Laravel facilite la création de controllers en suivant le modèle RESTful. Un controller resource prend en charge automatiquement les opérations CRUD (Create, Read, Update, Delete).

Déclaration d'une route ressource

// routes/web.php

use App\Http\Controllers\UserController;

Route::resource('users', UserController::class);

Exemple complet d’un Controller Resource

// app/Http/Controllers/UserController.php

namespace App\Http\Controllers;

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

class UserController extends Controller
{
    // Afficher tous les utilisateurs
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }

    // Afficher le formulaire pour créer un utilisateur
    public function create()
    {
        return view('users.create');
    }

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

        User::create($validated);

        return redirect()->route('users.index');
    }

    // Afficher un utilisateur précis
    public function show(User $user)
    {
        return view('users.show', compact('user'));
    }

    // Afficher le formulaire d'édition
    public function edit(User $user)
    {
        return view('users.edit', compact('user'));
    }

    // Mettre à jour un utilisateur
    public function update(Request $request, User $user)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email,' . $user->id,
        ]);

        $user->update($validated);

        return redirect()->route('users.index');
    }

    // Supprimer un utilisateur
    public function destroy(User $user)
    {
        $user->delete();

        return redirect()->route('users.index');
    }
}

Chaque méthode correspond précisément à une action CRUD. Plus aucune excuse pour t'embrouiller.

Réponse JSON pour les API

Dans un contexte API, le controller renvoie des données JSON plutôt que des vues HTML :

Déclaration de la route API

// routes/api.php

use App\Http\Controllers\Api\UserController;

Route::get('/users', [UserController::class, 'index']);

Exemple de Controller JSON

// app/Http/Controllers/Api/UserController.php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;

class UserController extends Controller
{
    public function index()
    {
        $users = User::all();
        return response()->json($users);
    }
}

Laravel gère automatiquement la sérialisation JSON des données.


Grâce à ces exemples détaillés, même toi tu devrais comprendre comment fonctionnent les controllers dans Laravel.