Laravel 5.4 - 覆盖API'油门:60,1'

时间:2017-05-26 12:57:37

标签: php laravel-5.4 throttling

我写了很多API来获取和存储数据 我喜欢默认的throttle选项:

protected $middlewareGroups = [
    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

将请求限制为每分钟60;但是对于某些路线(es:POST),我想增加这个值。

我尝试在路由中间件上设置'throttle:500,1',如下所示:

Route::group(function () {
        Route::get('semaphore/1',        ['uses' => 'App\Api\V1\DBs\SemaphoreController@index']);
        Route::post('semaphore/1',       ['uses' => 'App\Api\V1\DBs\SemaphoreController@store',        'middleware' => 'WriteToDatabaseMiddleware', 'throttle:500,1']);
});

但它不起作用。

有什么想法吗?

谢谢。

更新
我注意到'throttle:500,1'路由中使用的api.php将在'throttle:60,1'文件中指定的默认Kernel.php之后设置;那么,它没有用。

记录流程执行,第一个调用是:

Illuminate\Routing\Middleware\ThrottleRequests -> handle
来自Kernel.php

maxAttempts=60

然后,第二个电话是:

Illuminate\Routing\Middleware\ThrottleRequests -> handle
来自api.php

maxAttempts=500

换句话说,throttle:500,1文件中的api.php不会覆盖throttle:60,1文件中的Kernel.php

2 个答案:

答案 0 :(得分:15)

当前答案

根据this GitHub issue,油门中间件不应该使用"两次" (就像你想要那样)。如何正确处理当前问题只有两种方式":

  1. 编写自己的限制中间件
    1. 为每个路径(组)
    2. 定义节流中间件单独

      旧答案

      您设置中间件密钥错误!在声明要使用多个中间件时,为它们创建一个新数组

      ['middleware' => ['WriteToDatabaseMiddleware','throttle:500,1']]
      

      编辑:由于中间件订单,您应该将内核限制设置为您要使用的最高值,以及应该具有降低油门值到相应的值。

答案 1 :(得分:0)

在laravel 5.9之后,您可以使用前缀来防止全局限制。 使用'throttle:5,1,prefix'

Route::group(['prefix' => 'contact-us', 'middleware' => 'throttle:5,1,contact-form',], function () {
    Route::post('/', 'ContactUsController@store');
});

Allow multiple throttles by naming

相关问题