RouteServiceProvider代码讲解

这段代码是 Laravel 框架中 RouteServiceProvider 类的一部分,用于配置应用程序的路由和速率限制器。下面是对这段代码的详细解释:

方法 boot

public function boot(): void
{
    // Rate Limiter 配置
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
    });

    // 路由配置
    $this->routes(function () {
        // 为 API 路由组添加 'api' 中间件和 'api' 前缀
        Route::middleware('api')
            ->prefix('api')
            ->group(base_path('routes/api.php'));

        // 为 Web 路由组添加 'web' 中间件
        Route::middleware('web')
            ->group(base_path('routes/web.php'));
    });
}

详细解释

速率限制器配置

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
  • RateLimiter::for('api', ...):为名为 'api' 的速率限制器定义规则。
  • function (Request $request):匿名函数,接受一个 Request 对象作为参数。
  • Limit::perMinute(60):定义每分钟最多 60 次请求的限制。
  • by($request->user()?->id ?: $request->ip()):基于用户 ID 或 IP 地址进行限制。如果用户已登录,则使用用户 ID,否则使用请求的 IP 地址。

这个配置的意思是:对 API 请求进行速率限制,每个用户(根据其 ID)或每个 IP 地址每分钟最多可以发送 60 次请求。

路由配置

$this->routes(function () {
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));

    Route::middleware('web')
        ->group(base_path('routes/web.php'));
});
  • $this->routes(function () { ... }):定义应用程序的路由配置。

    • Route::middleware('api'):应用名为 api 的中间件(通常包含速率限制、身份验证等)到下面定义的路由组。

    • ->prefix('api'):为下面定义的所有路由添加 api 前缀。例如,如果在 routes/api.php 中定义了 /users 路由,它将变为 /api/users

    • ->group(base_path('routes/api.php')):将 routes/api.php 文件中的路由包含进来,并应用上述中间件和前缀配置。

    • Route::middleware('web'):应用名为 web 的中间件(通常包含会话、CSRF 保护等)到下面定义的路由组。

    • ->group(base_path('routes/web.php')):将 routes/web.php 文件中的路由包含进来,并应用 web 中间件。

总结

这段代码实现了以下几个关键功能:

  1. 速率限制:为 API 请求设置速率限制,每个用户或 IP 地址每分钟最多 60 次请求。
  2. 路由配置
    • routes/api.php 文件中的路由配置为 API 路由,应用 api 中间件并添加 api 前缀。
    • routes/web.php 文件中的路由配置为 Web 路由,应用 web 中间件。

通过这种方式,Laravel 框架可以有效地管理 API 和 Web 路由的不同需求,确保适当的中间件和前缀被应用。

实战应用

如果要对路由进行版本控制,可以修改如下代码,比如增加一个v1版本的路由

public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->prefix('api')
                ->group(base_path('routes/api.php'));
            //实战精髓代码在这里
            Route::middleware('api')
                ->prefix('api/v1')
                ->group(base_path('routes/api_v1.php'));

            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
posted @ 2024-05-15 12:16  Laravel自学开发  阅读(17)  评论(0编辑  收藏  举报