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
中间件。
-
总结
这段代码实现了以下几个关键功能:
- 速率限制:为 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'));
});
}