Laravel 5.4 - переопределить API «дроссель: 60,1»

Я пишу много 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.


person vlauciani    schedule 26.05.2017    source источник


Ответы (2)


Текущий ответ

Согласно этой проблеме GitHub, промежуточное ПО дросселя не должно быть используется «дважды» (как вы хотите это сделать). Есть только два способа, как «правильно» справиться с вашей текущей проблемой:

  1. Напишите собственное ПО промежуточного слоя для регулирования

or

  1. Определить промежуточное ПО дросселя отдельно для каждого маршрута (группы)

Старый ответ

Вы неправильно установили ключ промежуточного программного обеспечения! При объявлении нескольких промежуточных программ для использования создайте для них новый массив

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

EDIT: из-за порядка промежуточного программного обеспечения вы должны установить дроссель ядра на самое высокое значение, которое вы хотите использовать, и все другие маршруты, которые должны иметь более низкий дроссель. value на соответствующие.

person manniL    schedule 26.05.2017
comment
Пожалуйста, @vlauciani Было бы здорово, если бы вы приняли ответ, потому что он решил вашу проблему :) - person manniL; 27.05.2017
comment
Я тестирую свой код, но он не работает; Я обновил свой Вопрос с расследованием. - person vlauciani; 31.05.2017
comment
@vlauciani Что ж, тогда вам следует изменить значения ядра на throttle:500,1 (на более высокое), а все остальные маршруты, которые должны иметь дроссель, на throttle:60,1. Это должно работать с порядком запроса. - person manniL; 31.05.2017
comment
да, ваше решение - это моя идея... проблема в том, что при таком подходе весь маршрут будет установлен на 500; я должен помнить, чтобы установить 60 каждый новый маршрут. Я предпочитаю иметь стандартное значение (например: 60) и переопределять на 500 только конкретный маршрут. - person vlauciani; 31.05.2017
comment
@vlauciani Я понимаю твою точку зрения. В любом случае, поскольку похоже, что проблема связана с сайтом Laravel, лучше создать проблему в их репозитории GitHub. Я не могу больше здесь :| - person manniL; 31.05.2017
comment
@vlauciani Обновление - person manniL; 02.06.2017
comment
Спасибо, @manniL, теперь я прочитал ваш текущий ответ. Хорошо, это проясняет операцию; Я думаю, что решение состоит в том, чтобы создать собственное промежуточное программное обеспечение для дросселирования. Еще раз спасибо. - person vlauciani; 02.06.2017

В laravel 6 вы можете использовать префикс для предотвращения глобального дросселя. используйте 1_

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

Разрешить несколько ограничений путем присвоения имени

person Ali Yousefi    schedule 01.12.2019
comment
Ларавель 5.9? Вы имеете в виду Laravel 6? После 5.8 Laravel перешел на семантическое управление версиями, начиная с версии 6.0.0. - person Andrew Bibby; 05.02.2020
comment
Привет, Эндрю, версия 5.9 неверна, исправь мой ответ. если вы хотите использовать префикс в промежуточном программном обеспечении дросселя, этот запрос на включение может помочь вам разрешить несколько дросселей путем именования. - person Ali Yousefi; 07.02.2020