首页 > 其他分享 >RouteServiceProvider代码讲解

RouteServiceProvider代码讲解

时间:2024-05-15 12:19:18浏览次数:17  
标签:web RouteServiceProvider 代码 request api 讲解 routes php 路由

这段代码是 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'));
        });
    }

标签:web,RouteServiceProvider,代码,request,api,讲解,routes,php,路由
From: https://www.cnblogs.com/laraveler/p/18193595

相关文章

  • 反编译APK获取代码&资源
    反编译APK获取代码&资源"反编译Apk",看上去好像好像很高端的样子,其实不然,就是通过某些反编译软件,对我们的APK进行反编译,从而获取程序的源代码,图片,XML资源等文件;不知道你有没有这样做过,看到一个别人的一个APP界面做得很精美,或者你看上别人的图片素材,简单点的,我们可以下载别人的A......
  • RSA加解密懒得写了,记录一下代码
    packagecom.hoyo.common.core.utils;importcom.hoyo.common.core.utils.uuid.UUID;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;importjavax.crypto.Cipher;importjava.io.ByteArrayOutputStream;importjava.nio.charset.StandardCharsets;importjava......
  • 代码随想录算法训练营第第七天 | 454.四数相加II 、383. 赎金信 、15. 三数之和 、18
    454.四数相加II建议:本题是使用map巧妙解决的问题,好好体会一下哈希法如何提高程序执行效率,降低时间复杂度,当然使用哈希法会提高空间复杂度,但一般来说我们都是舍空间换时间,工业开发也是这样。题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.四数相加II.html......
  • 代码随想录算法训练营第七天 | 454.四数相加II 383.赎金信 15.三数和
    四数相加II题目链接文章讲解视频讲解时间复杂度o(n2)空间复杂度o(n)classSolution{public:intfourSumCount(vector<int>&nums1,vector<int>&nums2,vector<int>&nums3,vector<int>&nums4){unordered_map<int,int>tw......
  • java代码开发规范
    1、工程结构 工程分为三个module:sdk、biz、api,api依赖bizbiz依赖sdk 1.1、apiapi功能主要是与外部的交互部分,包括向前端提供的接口,向外部提供的RPC服务的实现等。包分类;主要包括的package包括但不限于包名功能描述规范备注api向外部提供的RPC接口实现......
  • 探究——C# .net 代码混淆/加壳
    背景:保密。过程:先查询一下常见的加壳工具:DotFuscator,官方自带,据说免费版混淆程度不高ConfuserEx,只支持.NETFramework2.0/3.0/3.5/4.0/4.5/4.6/4.7/4.8,不支持.NETCoreVirboxProtector,很好很优秀,但是收费NETReactor,最新6.9版收费,PJ版到4.9不支持.NETCoreObfu......
  • Python 内置库 多线程threading使用讲解
    线程基本使用单线程defmain():print("在扔一个苹果")if__name__=="__main__":main()多线程Python提供了thread、threading等模块来进行线程的创建与管理,后者在线程管理能力上更进一步,因此我们通常使用threading模块。创建一个线程需要指定该线程执行的任务(函......
  • 实现Python日志点击跳转到代码位置的方法
    前言在软件开发过程中,日志是一种非常重要的工具,用于记录程序运行时的状态、错误信息以及调试信息。当程序出现问题时,定位到具体的代码位置对于排查问题至关重要。本文将介绍如何在Python日志中实现点击跳转到代码位置的功能,以提高调试效率。为什么需要点击跳转功能?通常情况下,......
  • git 查看当前代码是在哪个 tag 上
    在Git中,查看当前代码所在的tag可以使用以下命令:###查看当前提交所对应的所有tag如果你想查看当前HEAD或者某个特定的commit对应的所有tag,可以使用下面的命令:gittag--containsHEAD这个命令会列出包含当前HEAD的所有tag。如果你想查看某个特定commit的......
  • 使用快捷键的方式把多个关键字文本快速替换(快速替换AE脚本代码)
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z 这里做AE(AdobeAfterEffact)里的脚本规则,把英文替换成中文,如下swap=thisComp.layer(“Segmentsettings”).effect("%")(“Checkbox”);if(swap==true){s=thisComp.layer(“Segmentsettings”).effect(“S......