這段程式碼是 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
中介軟體。
-
總結
這段程式碼實現了以下幾個關鍵功能:
- 速率限制:為 API 請求設定速率限制,每個使用者或 IP 地址每分鐘最多 60 次請求。
- 路由配置:
- 將
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'));
});
}