Laravel 的路由系统是框架的核心入口,它将用户的 HTTP 请求映射到对应的控制器或闭包函数。掌握路由定义是学习 Laravel 的第一步,本文将带你详细了解 Laravel 11 中路由的各种定义方式及实用技巧。
所有路由都定义在 routes/ 目录下的文件中,框架自动加载这些文件:
web.php —— 用于 Web 界面路由,自动应用 web 中间件组(Session、CSRF 保护等)。api.php —— 用于 API 路由,前缀为 /api,自动应用 api 中间件组(速率限制等)。console.php —— 用于定义 Artisan 命令(基于闭包)。channels.php —— 用于注册事件广播频道。本教程主要针对 routes/web.php 中定义的基础路由进行讲解。
最基本的 Laravel 路由接受一个 URI 和一个闭包函数,也可以指向控制器方法。以下是常见的 HTTP 动词路由:
// 返回字符串
Route::get('/', function () {
return '欢迎来到 Laravel 11 首页';
});
// 返回视图
Route::get('/welcome', function () {
return view('welcome');
});
// 指向控制器方法 (假设有 UserController)
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::put('/users/{id}', [UserController::class, 'update']);
Route::patch('/users/{id}', [UserController::class, 'partialUpdate']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);
// 匹配 GET 或 POST
Route::match(['get', 'post'], '/feedback', function () {
return '处理反馈';
});
// 响应所有 HTTP 方法
Route::any('/any-path', function () {
return '任何请求都会到达这里';
});
通过路由参数可以捕获 URL 片段,分为必填参数和可选参数,并支持正则约束。
Route::get('/user/{id}', function (string $id) {
return "用户ID: " . $id;
});
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
return "帖子 {$postId} 的评论 {$commentId}";
});
在参数名后加 ? 标记为可选,并且需要为参数设置默认值。
Route::get('/user/{name?}', function ($name = 'Guest') {
return "用户名: " . $name;
});
使用 where 方法限制参数格式:
Route::get('/user/{id}', function ($id) {
return "ID 必须是数字: " . $id;
})->where('id', '[0-9]+');
Route::get('/profile/{username}', function ($username) {
return "用户名: " . $username;
})->where('username', '[A-Za-z]+');
// 多个参数同时约束
Route::get('/{category}/{slug}', function ($category, $slug) {
return "分类: {$category}, 别名: {$slug}";
})->where(['category' => '[a-z]+', 'slug' => '[a-z0-9-]+']);
为路由起一个唯一的别名,方便在应用程序中生成 URL 或重定向。即使路由路径改变,使用名称生成的链接也无需修改。
// 定义命名路由
Route::get('/user/profile', [UserProfileController::class, 'show'])->name('profile.show');
// 生成 URL
$url = route('profile.show');
// 重定向
return redirect()->route('profile.show');
// 带参数的路由命名
Route::get('/user/{id}/profile', function ($id) {
// ...
})->name('profile.view');
// 生成带参数的 URL
$url = route('profile.view', ['id' => 1]);
路由组允许共享路由属性,如中间件、前缀、命名空间等,避免重复代码。
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// 实际访问 URI: /admin/users
});
Route::get('/settings', function () {
// 实际访问 URI: /admin/settings
});
});
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', function () {
// 需要认证且已验证邮箱的用户访问
});
Route::get('/profile', [ProfileController::class, 'edit']);
});
Route::namespace('Admin')->group(function () {
// 控制器位于 "App\Http\Controllers\Admin" 命名空间下
Route::get('/users', 'UserController@index');
});
Route::domain('{account}.myapp.com')->group(function () {
Route::get('/dashboard', function ($account) {
return "账号 {$account} 的控制面板";
});
});
对于只需要返回视图或重定向的简单路由,Laravel 提供了快捷方法:
// 直接返回视图,无需定义闭包
Route::view('/about', 'pages.about', ['title' => '关于我们']);
// 重定向路由 (301 或 302)
Route::redirect('/old-url', '/new-url', 301);
当没有匹配到任何路由时,可以使用 fallback 方法处理 404 请求,通常放在路由文件最后。
Route::fallback(function () {
return response()->view('errors.404', [], 404);
});
使用 Artisan 命令可以快速列出当前应用的所有路由,非常适合调试:
php artisan route:list
#[Route] 属性(需要安装 laravel/routing 扩展?实际上Laravel 11 默认使用 routes/web.php 集中定义,也可使用 php artisan make:controller 生成控制器)。本文示例均基于传统的路由文件定义方式,是学习基础的最佳实践。
通过以上内容,你已经掌握了 Laravel 路由定义的核心技能。从简单的闭包路由到复杂的带参数、分组路由,灵活运用这些知识可以为你的应用构建清晰、强大的入口层。下一步,你可以结合控制器深入了解 MVC 架构。