Secara lalai, Laravel menyediakan dua perisian tengah untuk mengehadkan kadar (mendikit):
\Illuminate\Routing\Middleware\ThrottleRequests::class \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class
Seperti yang dinyatakan dalam dokumentasi, jika anda menggunakan Redis sebagai pemacu cache, anda boleh menukar pemetaan dalam Kernel.php
seperti ini:
/** * 应用程序的中间件别名。 * * 别名可用于将中间件方便地分配给路由和组,而不是使用类名。 * * @var array<string, class-string|string> */ protected $middlewareAliases = [ // ... 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class // ... ];
Masalahnya ialah perkara di atas tidak dinamik tetapi bergantung kepada persekitaran. Contohnya, dalam staging
和production
环境中,我使用Redis,但在我的local
和development
persekitaran saya, saya tidak menggunakan Redis.
Terdapat penyelesaian kotor yang jelas, seperti ini (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); }
Adakah terdapat cara "standard" untuk memilih perisian tengah yang berkaitan secara dinamik tanpa mengatasi Kernel
构造函数的情况下实现这一点?基本上,我希望我的应用程序可以根据环境是否设置为production
(或者默认缓存存储设置为redis
).
Penyelesaian di atas tidak berfungsi kerana kernel diakses sebelum aplikasi dibut, jadi persekitaran tidak tersedia pada masa ini. Penyelesaian lain yang saya cari sekarang ialah melanjutkan kelas asas ThrottleRequests
supaya kelas yang berkaitan boleh dipanggil secara dinamik.
Selepas banyak penyelidikan dan ujian, saya sampai pada kesimpulan bahawa
RouteServiceProvider
中动态设置throttle
middleware adalah penyelesaian terbaik, kodnya adalah seperti berikut: