Aller au contenu principal

Module 11 – Routes & Contrôleurs

Niveau 3 – Laravel fondamental


Objectifs

Routes web et API, association à un contrôleur ou une closure, middleware, et validation (Form Request ou validation intégrée).


Théorie

Routes web (routes/web.php)

Les routes sont définies dans routes/web.php. Par défaut elles ont le middleware web (session, CSRF, cookies).

Closure (fonction anonyme) :

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
return view('welcome');
});

Route::get('/contact', function () {
return 'Page contact';
});

Avec contrôleur :

use App\Http\Controllers\PageController;

Route::get('/', [PageController::class, 'home']);
Route::get('/contact', [PageController::class, 'contact']);

Paramètres dans l’URL :

Route::get('/user/{id}', function (string $id) {
return "User $id";
});
Route::get('/article/{slug}', [ArticleController::class, 'show']);

Paramètre optionnel :

Route::get('/blog/{category?}', function (?string $category = null) {
return $category ?? 'All articles';
});

Contraintes :

Route::get('/user/{id}', function (string $id) {
// ...
})->where('id', '[0-9]+');

Nommer une route : pour générer des URLs avec route('name') :

Route::get('/contact', [PageController::class, 'contact'])->name('contact');
// Dans une vue : <a href="{{ route('contact') }}">Contact</a>

Routes API (routes/api.php)

Dans routes/api.php, les routes sont préfixées par /api et ont le middleware api (pas de session, format JSON attendu). Idéal pour une API REST.

Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{user}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);

Contrôleurs

Créer un contrôleur :

php artisan make:controller PageController

Contrôleur avec méthodes :

namespace App\Http\Controllers;

class PageController extends Controller
{
public function home()
{
return view('welcome');
}

public function contact()
{
return view('contact');
}
}

Passer des données à la vue :

public function show(int $id)
{
$user = User::find($id);
return view('user.show', ['user' => $user]);
// ou : return view('user.show', compact('user'));
}

Réponse JSON :

return response()->json(['data' => $users]);

Redirection :

return redirect()->route('home');
return redirect()->back();

Middleware

Les middleware exécutent du code avant (et éventuellement après) le traitement de la requête. Utilisés pour : auth, vérification de rôle, log, rate limiting.

Appliquer à une route :

Route::get('/admin', [AdminController::class, 'index'])->middleware('auth');
Route::get('/profil', [ProfilController::class, 'edit'])->middleware(['auth', 'verified']);

Middleware intégrés : auth, guest, verified, throttle:60,1 (rate limit), etc.

Créer un middleware : php artisan make:middleware CheckAuth, puis enregistrer dans app/Http/Kernel.php ou dans le bootstrap (Laravel 11).


Validation des requêtes

Dans le contrôleur :

use Illuminate\Http\Request;

public function store(Request $request)
{
$validated = $request->validate([
'email' => 'required|email',
'name' => 'required|string|max:255',
]);
// $validated contient uniquement les champs validés
}

En cas d’échec, Laravel renvoie automatiquement une redirection avec les erreurs (en web) ou une réponse JSON (en API). Les erreurs sont disponibles dans la vue avec @error('field') ou $errors->get('field').

Règles courantes : required, email, string, integer, max:255, min:8, confirmed (pour mot de passe + confirmation), unique:users,email.


Exemple complet

routes/web.php :

Route::get('/', [PageController::class, 'home'])->name('home');
Route::get('/articles', [ArticleController::class, 'index'])->name('articles.index');
Route::get('/articles/{article}', [ArticleController::class, 'show'])->name('articles.show');
Route::post('/articles', [ArticleController::class, 'store'])->middleware('auth');

ArticleController :

public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'body' => 'required|string',
]);
$article = Article::create($validated);
return redirect()->route('articles.show', $article)->with('success', 'Article created.');
}

Bonnes pratiques

  1. Nommer les routes pour les liens et redirections (->name('...')).
  2. Valider toutes les entrées utilisateur dans le contrôleur (ou Form Request).
  3. Controller fin : déléguer la logique métier à des services ou au modèle.
  4. Middleware : utiliser auth pour les pages protégées, throttle pour limiter les abus.

Quiz – Module 11

Q1. Où sont définies les routes web dans Laravel ?
Q2. Comment passer un paramètre d’URL à une méthode de contrôleur ?
Q3. À quoi sert le middleware auth ?
Q4. Comment renvoyer une vue avec des variables depuis un contrôleur ?
Q5. Que se passe-t-il si la validation $request->validate([...]) échoue ?

Réponses

R1. Dans routes/web.php (et routes/api.php pour l’API).

R2. En mettant le paramètre entre { } dans l’URL (ex. {id}) et en déclarant un argument du même nom dans la méthode du contrôleur (ex. function show(int $id)).

R3. À restreindre l’accès aux utilisateurs connectés ; sinon redirection vers la page de login.

R4. Avec return view('name.view', ['key' => $value]); ou compact('var1', 'var2').

R5. Laravel redirige vers la page précédente (web) ou renvoie une réponse JSON (API) avec les erreurs de validation ; le code après validate() n’est pas exécuté.


Suite

Module 12 – Blade & Frontend Laravel (syntaxe Blade, layouts, composants, formulaires sécurisés).