Skip to Content
LaravelRouting

Routing — Routes et Controllers Laravel 12

Système de routing moderne avec controllers et middlewares.

🛣️ Routes de base

Fichiers de routes

// routes/web.php // Routes web (sessions, CSRF) // routes/api.php // Routes API (stateless) // routes/console.php // Commandes Artisan

Routes GET

Route::get('/', fn () => 'Hello World'); Route::get('/user/{id}', fn ($id) => "User {$id}"); Route::get('/user/{name?}', fn ($name = null) => $name ?? 'Guest'); // Contraintes Route::get('/user/{id}', fn ($id) => "User {$id}") ->where('id', '[0-9]+'); // Contraintes globales (RouteServiceProvider) Route::pattern('id', '[0-9]+');

Routes multiples

Route::match(['get', 'post'], '/', fn () => '...'); Route::any('/', fn () => '...'); // Redirections Route::redirect('/old', '/new'); Route::permanentRedirect('/old', '/new'); // Routes de vue Route::view('/welcome', 'welcome'); Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

🎮 Controllers

Création

php artisan make:controller UserController php artisan make:controller PostController --resource php artisan make:controller API/PostController --api php artisan make:controller PostController --model=Post --resource

Controller moderne (PHP 8.2+)

<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\View\View; class UserController extends Controller { public function __construct( private UserService $userService ) {} public function index(): View { $users = User::paginate(10); return view('users.index', compact('users')); } public function store(StoreUserRequest $request): JsonResponse { $user = $this->userService->create($request->validated()); return response()->json($user, 201); } public function show(User $user): View { return view('users.show', compact('user')); } }

Resource Routes

Route::resource('posts', PostController::class); // Génère 7 routes CRUD automatiquement // Routes partielles Route::resource('photos', PhotoController::class)->only(['index', 'show']); Route::resource('photos', PhotoController::class)->except(['create', 'store']); // API resource (sans create/edit) Route::apiResource('posts', API\PostController::class); // Nested resources Route::resource('posts.comments', CommentController::class);

Invokable Controllers

<?php class DeletePostController extends Controller { public function __invoke(Post $post): RedirectResponse { $post->delete(); return back()->with('success', 'Post deleted'); } } // routes/web.php Route::delete('/posts/{post}', DeletePostController::class);

🏷️ Routes nommées

Route::get('/user/profile', [UserController::class, 'show']) ->name('user.profile'); Route::get('/user/{id}', [UserController::class, 'show']) ->name('user.show'); // Utilisation <a href="{{ route('user.profile') }}">Profile</a> <a href="{{ route('user.show', $user->id) }}">{{ $user->name }}</a> return redirect()->route('user.profile'); return redirect()->route('user.show', ['id' => $user->id]);

Groupes de routes

Route::prefix('admin')->group(function () { Route::get('/users', [AdminController::class, 'users']); Route::get('/posts', [AdminController::class, 'posts']); }); Route::middleware(['auth', 'verified'])->group(function () { Route::get('/dashboard', [DashboardController::class, 'index']); }); // Combinaison complète Route::prefix('api/v1') ->middleware(['api', 'auth:api']) ->group(function () { Route::apiResource('users', UserController::class); Route::apiResource('posts', PostController::class); });

🛡️ Middlewares

Création

php artisan make:middleware CheckAge
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class CheckAge { public function handle(Request $request, Closure $next) { if ($request->age < 18) { return redirect('home'); } return $next($request); } }

Utilisation

// Enregistrement (Kernel.php) protected $routeMiddleware = [ 'age' => \App\Http\Middleware\CheckAge::class, ]; // Application Route::get('/profile', fn () => '...')->middleware('age'); Route::get('/admin', fn () => '...')->middleware(['auth', 'admin']); Route::get('/profile', fn () => '...')->middleware('role:editor,admin');

🌐 API Routes

API Controller moderne

<?php namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; class UserController extends Controller { public function index(): JsonResponse { return response()->json(User::paginate(10)); } public function store(StoreUserRequest $request): JsonResponse { $user = User::create($request->validated()); return response()->json($user, 201); } public function show(User $user): JsonResponse { return response()->json($user); } public function update(UpdateUserRequest $request, User $user): JsonResponse { $user->update($request->validated()); return response()->json($user); } public function destroy(User $user): JsonResponse { $user->delete(); return response()->json(null, 204); } }

API Authentication

// Sanctum (SPA/mobile) Route::middleware('auth:sanctum')->group(function () { Route::apiResource('users', UserController::class); }); // Passport (OAuth2) Route::middleware('auth:api')->group(function () { Route::apiResource('users', UserController::class); });

📝 Validation

Form Request

php artisan make:request StorePostRequest
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StorePostRequest extends FormRequest { public function authorize(): bool { return true; } public function rules(): array { return [ 'title' => 'required|string|max:255', 'content' => 'required|string', 'category_id' => 'required|exists:categories,id', 'published' => 'boolean', 'tags' => 'array', 'tags.*' => 'exists:tags,id', ]; } }

Controller avec validation

public function store(StorePostRequest $request): JsonResponse { $post = Post::create($request->validated()); return response()->json($post, 201); }

🔧 Response Helpers

// Vue return view('welcome', ['name' => 'Taylor']); // JSON return response()->json(['name' => 'Taylor', 'age' => 28]); return response()->json(['error' => 'Unauthorized'], 401); // Download return response()->download($pathToFile); return response()->file($pathToFile); // Redirect return redirect('/home'); return redirect()->route('profile'); return redirect()->away('https://laravel.com'); // Avec données flash return redirect('/dashboard')->with('success', 'Profile updated!');

Le GPS de votre application Laravel