Maison > Questions et réponses > le corps du texte
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 :
/** * 应用程序的中间件别名。 * * 别名可用于将中间件方便地分配给路由和组,而不是使用类名。 * * @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
环境中,我使用Redis,但在我的local
和development
environnement, je n'utilise pas Redis.
Il existe une solution sale évidente, quelque chose comme ceci (Kernel.php
) :
/** * 应用程序的中间件别名。 * * 别名可用于将中间件方便地分配给路由和组,而不是使用类名。 * * @var array<string, class-string|string> */ protected $middlewareAliases = [ // ... 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class // ... ]; /** * 创建一个新的HTTP内核实例。 * * @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
构造函数的情况下实现这一点?基本上,我希望我的应用程序可以根据环境是否设置为production
(或者默认缓存存储设置为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.
P粉0434322102024-01-11 16:27:49
Après de nombreuses recherches et tests, je suis arrivé à la conclusion que RouteServiceProvider
中动态设置throttle
middleware est la meilleure solution, le code est le suivant :
class RouteServiceProvider extends ServiceProvider { /** * 启动任何应用程序服务。 * * @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); } }