В стандартной комплектации Laravel предоставляет два промежуточных программного обеспечения, которые можно использовать для ограничения скорости (регулирования):
Код: Выделить всё
\Illuminate\Routing\Middleware\ThrottleRequests::class
\Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class
Код: Выделить всё
/**
* The application's middleware aliases.
*
* Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
*
* @var array
*/
protected $middlewareAliases = [
// ...
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class
// ...
];
Проблема в том, что описанное выше не является динамическим и зависит от среды. Например, в промежуточной и рабочей среде я использую Redis, а в локальной и среде разработки — нет.
Возможное решение
Есть очевидное грязное решение, что-то вроде этого (
Код: Выделить всё
Kernel.phpКод: Выделить всё
/**
* The application's middleware aliases.
*
* Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
*
* @var array
*/
protected $middlewareAliases = [
// ...
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class
// ...
];
/**
* Create a new HTTP kernel instance.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function __construct(Application $app, Router $router)
{
if ($app->environment('production')) {
$this->middlewareAliases['throttle'] = \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class;
}
parent::__construct($app, $router);
}
Обновление
Приведенное выше решение не работает, поскольку доступ к ядру осуществляется до загрузки приложения, поэтому среда на данный момент недоступна. Другое решение, которое я сейчас рассматриваю, — это расширение базового класса ThrottleRequests для динамического вызова соответствующего класса.
Подробнее здесь: https://stackoverflow.com/questions/767 ... in-laravel