新手laravel中间件请教


        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

这个 'throttle:api', 什么意思?只知道是限速的中间件,但是后面带个api参数什么意思?我看百度有些答案都是 throttle:60,1

阅读 2.1k
2 个回答

你好,这是中间件参数,文档上有的

中间件参数以冒号开始,多个参数逗号分割

php是弱类型语言,所以参数类型和参数个数经常混着用。

throttle:api表示使用api命名的RateLimiter

throttle:60,1表示一分钟60个请求

当参数是api的时候,$maxAttempts就是api

当参数是60,1的时候,$maxAttempts等于60$decayMinutes等于1

以下是部分源码:

/**
     * /Illuminate/Routing/Middleware/ThrottleRequests.php
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  int|string  $maxAttempts
     * @param  float|int  $decayMinutes
     * @param  string  $prefix
     * @return \Symfony\Component\HttpFoundation\Response
     * 
     * @throws \Illuminate\Http\Exceptions\ThrottleRequestsException
     * 
     */
    public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1, $prefix = '')
    {
        if (is_string($maxAttempts)
            && func_num_args() === 3
            && ! is_null($limiter = $this->limiter->limiter($maxAttempts))) {
            return $this->handleRequestUsingNamedLimiter($request, $next, $maxAttempts, $limiter);
        }
        
        // ....
     }

首先这个中间件的名字 准确点应该叫限流。
然后 throttle:api 这里的 api 或者 60,1 会传给执行函数,函数会进行判断传的是什么

如果传入的是字符串,比如 api 就是加了个前缀,方便做区分用的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题