路由基础 #
一、路由概述 #
1.1 什么是路由 #
路由是将URL映射到具体处理逻辑的机制。当用户访问某个URL时,路由系统决定由哪个控制器方法来处理这个请求。
text
用户请求流程
┌─────────────┐
│ 用户请求 │
│ GET /users │
└──────┬──────┘
│
▼
┌─────────────┐
│ 路由系统 │
│ 匹配URL │
└──────┬──────┘
│
▼
┌─────────────┐
│ 控制器方法 │
│ 处理请求 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 返回响应 │
└─────────────┘
1.2 路由文件 #
Laravel路由定义在 routes 目录下:
| 文件 | 用途 |
|---|---|
| routes/web.php | Web界面路由 |
| routes/api.php | API路由 |
| routes/console.php | 命令行路由 |
| routes/channels.php | 广播频道 |
二、基本路由 #
2.1 最简单的路由 #
php
// routes/web.php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return 'Hello, Laravel!';
});
2.2 路由到控制器 #
php
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
2.3 路由到视图 #
php
Route::view('/welcome', 'welcome');
// 传递数据
Route::view('/about', 'about', ['title' => '关于我们']);
三、HTTP方法 #
3.1 支持的HTTP方法 #
php
use Illuminate\Support\Facades\Route;
// GET请求
Route::get('/users', function () {
return '获取用户列表';
});
// POST请求
Route::post('/users', function () {
return '创建用户';
});
// PUT请求(完整更新)
Route::put('/users/{id}', function ($id) {
return "更新用户 {$id}";
});
// PATCH请求(部分更新)
Route::patch('/users/{id}', function ($id) {
return "部分更新用户 {$id}";
});
// DELETE请求
Route::delete('/users/{id}', function ($id) {
return "删除用户 {$id}";
});
// OPTIONS请求
Route::options('/users', function () {
return '获取支持的HTTP方法';
});
3.2 match方法 #
匹配多种HTTP方法:
php
Route::match(['get', 'post'], '/contact', function () {
// 处理GET和POST请求
});
Route::match(['put', 'patch'], '/profile', function () {
// 处理PUT和PATCH请求
});
3.3 any方法 #
匹配所有HTTP方法:
php
Route::any('/fallback', function () {
return '匹配所有HTTP方法';
});
四、路由参数 #
4.1 必选参数 #
php
Route::get('/users/{id}', function ($id) {
return "用户ID: {$id}";
});
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
return "文章 {$postId} 的评论 {$commentId}";
});
4.2 可选参数 #
php
Route::get('/users/{id?}', function ($id = null) {
if ($id) {
return "用户ID: {$id}";
}
return '所有用户';
});
4.3 参数约束 #
使用 where 方法约束参数格式:
php
// 约束为数字
Route::get('/users/{id}', function ($id) {
return "用户ID: {$id}";
})->where('id', '[0-9]+');
// 约束为字母
Route::get('/users/{name}', function ($name) {
return "用户名: {$name}";
})->where('name', '[A-Za-z]+');
// 多个约束
Route::get('/posts/{id}/{slug}', function ($id, $slug) {
return "文章 {$id}: {$slug}";
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z0-9\-]+']);
4.4 全局约束 #
在 RouteServiceProvider 中定义全局约束:
php
// app/Providers/RouteServiceProvider.php
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
// 之后所有 {id} 参数都会自动应用此约束
Route::get('/users/{id}', function ($id) {
// $id 必须是数字
});
4.5 编码斜杠 #
Laravel默认不允许URL参数中包含斜杠,需要启用:
php
Route::get('/search/{query}', function ($query) {
return $query;
})->where('query', '.*');
五、路由命名 #
5.1 定义路由名称 #
php
Route::get('/users/profile', function () {
//
})->name('profile');
// 控制器路由命名
Route::get('/users', [UserController::class, 'index'])->name('users.index');
5.2 使用路由名称生成URL #
php
// 生成URL
$url = route('profile');
// 在视图中
<a href="{{ route('profile') }}">个人资料</a>
// 带参数的路由
Route::get('/users/{id}', function ($id) {
//
})->name('users.show');
$url = route('users.show', ['id' => 1]);
5.3 检查当前路由 #
php
// 检查当前路由是否匹配
if (request()->routeIs('users.*')) {
// 当前路由以 users. 开头
}
// 在视图中
@if(Route::currentRouteName() === 'users.index')
<p>这是用户列表页</p>
@endif
六、路由组 #
6.1 中间件组 #
php
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', function () {
// 需要认证和验证邮箱
});
Route::get('/profile', function () {
// 需要认证和验证邮箱
});
});
6.2 路由前缀 #
php
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// 匹配 /admin/users
});
Route::get('/posts', function () {
// 匹配 /admin/posts
});
});
6.3 名称前缀 #
php
Route::name('admin.')->group(function () {
Route::get('/users', function () {
// 路由名称: admin.users
})->name('users');
Route::get('/posts', function () {
// 路由名称: admin.posts
})->name('posts');
});
6.4 组合使用 #
php
Route::middleware(['auth'])
->prefix('admin')
->name('admin.')
->group(function () {
Route::get('/dashboard', function () {
// URL: /admin/dashboard
// 名称: admin.dashboard
// 中间件: auth
})->name('dashboard');
Route::resource('users', AdminUserController::class);
});
6.5 控制器组 #
php
Route::controller(UserController::class)->group(function () {
Route::get('/users', 'index');
Route::get('/users/{id}', 'show');
Route::post('/users', 'store');
});
七、重定向路由 #
7.1 基本重定向 #
php
// 301永久重定向
Route::redirect('/here', '/there');
// 302临时重定向(默认)
Route::redirect('/here', '/there', 302);
// 301永久重定向快捷方式
Route::permanentRedirect('/old', '/new');
7.2 带参数重定向 #
php
Route::redirect('/users/{id}', '/profile/{id}');
八、视图路由 #
8.1 直接返回视图 #
php
Route::view('/welcome', 'welcome');
// 传递数据
Route::view('/about', 'about', ['title' => '关于我们']);
// 命名视图路由
Route::view('/contact', 'contact')->name('contact');
九、路由列表 #
9.1 查看所有路由 #
bash
php artisan route:list
# 过滤路由
php artisan route:list --path=users
# 只显示API路由
php artisan route:list --path=api
# 显示中间件
php artisan route:list -v
# 只显示特定名称的路由
php artisan route:list --name=user
9.2 输出示例 #
text
+----------+----------------+------------------+------------------------+
| Method | URI | Name | Action |
+----------+----------------+------------------+------------------------+
| GET|HEAD | / | welcome | Closure |
| GET|HEAD | users | users.index | UserController@index |
| POST | users | users.store | UserController@store |
| GET|HEAD | users/{user} | users.show | UserController@show |
| PUT|PATCH| users/{user} | users.update | UserController@update |
| DELETE | users/{user} | users.destroy | UserController@destroy |
+----------+----------------+------------------+------------------------+
十、路由缓存 #
10.1 缓存路由 #
bash
# 生产环境缓存路由
php artisan route:cache
10.2 清除缓存 #
bash
php artisan route:clear
10.3 注意事项 #
text
路由缓存注意事项:
1. 只能在生产环境使用
2. 控制器路由不能使用闭包
3. 修改路由后需要重新缓存
4. 开发环境不建议使用
十一、回退路由 #
11.1 定义404处理 #
php
// 必须放在路由文件最后
Route::fallback(function () {
return response()->view('errors.404', [], 404);
});
11.2 条件回退 #
php
Route::fallback(function () {
if (request()->expectsJson()) {
return response()->json(['message' => 'Not Found'], 404);
}
return response()->view('errors.404', [], 404);
});
十二、CSRF保护 #
12.1 自动保护 #
web.php 中的路由默认启用CSRF保护:
php
// POST请求需要CSRF Token
Route::post('/users', function () {
// 自动验证CSRF Token
});
12.2 表单中包含Token #
blade
<form method="POST" action="/users">
@csrf
<!-- 表单字段 -->
</form>
12.3 排除CSRF保护 #
php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: [
'api/*',
'webhook/*',
]);
})
十三、总结 #
13.1 核心要点 #
| 要点 | 说明 |
|---|---|
| 路由定义 | 在routes目录下定义 |
| HTTP方法 | get、post、put、patch、delete |
| 路由参数 | 必选参数、可选参数、约束 |
| 路由命名 | name方法命名,route函数生成URL |
| 路由组 | middleware、prefix、name组合 |
13.2 下一步 #
掌握了路由基础后,让我们继续学习 路由参数,深入了解参数处理!
最后更新:2026-03-28