web-dev-qa-db-ja.com

Laravel 5.4-API 'throttle:60,1'のオーバーライド

データを取得して保存するためのAPIをたくさん書いています。
デフォルトのthrottleオプションが好きです:

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

要求を1分あたり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

from Kernel.phpにはmaxAttempts=60があります。

次に、2番目の呼び出しは次のとおりです。

Illuminate\Routing\Middleware\ThrottleRequests -> handle

from api.phpにはmaxAttempts=500があります。

つまり、throttle:500,1ファイルのapi.phpは、throttle:60,1ファイルのKernel.phpをオーバーライドしません。

16
vlauciani

現在の答え

このGitHubの問題 によると、スロットルミドルウェアはを2回使用するべきではありません(あなたがそれをしたいように)。現在の問題を「正しく」処理する方法は2つしかありません。

  1. 独自のスロットルミドルウェアを書く

または

  1. スロットルミドルウェアを定義する separately 各ルート(グループ)

古い答え

ミドルウェアキーを間違って設定しました!使用する複数のミドルウェアを宣言する場合、それらの新しいミドルウェアを作成します

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

EDIT:ミドルウェアの順序のため、使用するカーネルスロットルを最高値に設定する必要があります。 より低いスロットル値対応するものに。

17
manniL