RouteServiceProvider程式碼講解

Laravel自学开发發表於2024-05-15

這段程式碼是 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'));
        });
    }

相關文章