路由基础 #

一、路由概述 #

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