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 ArtisanRoutes 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 --resourceController 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