Регулирование с помощью Redis только в производстве в LaravelPhp

Кемеровские программисты php общаются здесь
Anonymous
Регулирование с помощью Redis только в производстве в Laravel

Сообщение Anonymous »

Справочная информация
В стандартной комплектации Laravel предоставляет два промежуточных программного обеспечения, которые можно использовать для ограничения скорости (регулирования):

Код: Выделить всё

\Illuminate\Routing\Middleware\ThrottleRequests::class
\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\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);
}
Существует ли «стандартный» способ добиться этого без необходимости переопределять конструктор ядра? По сути, я бы хотел, чтобы мое приложение динамически выбирало соответствующее промежуточное программное обеспечение в зависимости от того, настроена ли рабочая среда (или хранилище кэша по умолчанию настроено на Redis).
Обновление
Приведенное выше решение не работает, поскольку доступ к ядру осуществляется до загрузки приложения, поэтому среда на данный момент недоступна. Другое решение, которое я сейчас рассматриваю, — это расширение базового класса ThrottleRequests для динамического вызова соответствующего класса.

Подробнее здесь: https://stackoverflow.com/questions/767 ... in-laravel

Вернуться в «Php»