Par défaut, Laravel fournit deux middlewares pour la limitation du débit (throttling)?:
\Illuminate\Routing\Middleware\ThrottleRequests::class \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class
Comme l'indique la documentation, si vous utilisez Redis comme pilote de cache, vous pouvez modifier le mappage dans Kernel.php
comme ceci?:
/** * 應(yīng)用程序的中間件別名。 * * 別名可用于將中間件方便地分配給路由和組,而不是使用類名。 * * @var array<string, class-string|string> */ protected $middlewareAliases = [ // ... 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class // ... ];
Le problème est que ce qui précède n'est pas dynamique mais dépendant de l'environnement. Par exemple, dans mon staging
和production
環(huán)境中,我使用Redis,但在我的local
和development
environnement, je n'utilise pas Redis.
Il existe une solution sale évidente, quelque chose comme ceci (Kernel.php
) :
/** * 應(yīng)用程序的中間件別名。 * * 別名可用于將中間件方便地分配給路由和組,而不是使用類名。 * * @var array<string, class-string|string> */ protected $middlewareAliases = [ // ... 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class // ... ]; /** * 創(chuàng)建一個(gè)新的HTTP內(nèi)核實(shí)例。 * * @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); }
Existe-t-il un moyen "standard" de sélectionner dynamiquement un middleware pertinent sans écraser Kernel
構(gòu)造函數(shù)的情況下實(shí)現(xiàn)這一點(diǎn)?基本上,我希望我的應(yīng)用程序可以根據(jù)環(huán)境是否設(shè)置為production
(或者默認(rèn)緩存存儲設(shè)置為redis
).
La solution ci-dessus ne fonctionne pas car l'accès au noyau est effectué avant le démarrage de l'application, l'environnement n'est donc pas disponible pour le moment. Une autre solution que j'étudie maintenant consiste à étendre la classe de base ThrottleRequests
afin que les classes pertinentes puissent être appelées dynamiquement.
Après de nombreuses recherches et tests, je suis arrivé à la conclusion que RouteServiceProvider
中動態(tài)設(shè)置throttle
middleware est la meilleure solution, le code est le suivant :
class RouteServiceProvider extends ServiceProvider { /** * 啟動任何應(yīng)用程序服務(wù)。 * * @return void */ public function boot(): void { $this->registerThrottleMiddleware(); } /** * 注冊用于限制請求的中間件。 * * @return void */ private function registerThrottleMiddleware(): void { $router = app()->make('router'); $middleware = config('cache.default') !== 'redis' ? \Illuminate\Routing\Middleware\ThrottleRequests::class : \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class; $router->aliasMiddleware('throttle', $middleware); } }