Throttle 是 Laravel 的速率限制器

v10.2.0 2024-03-17 23:18 UTC

README

Laravel Throttle 由 Graham Campbell 创建并维护,是 Laravel 的速率限制器。您可以自由查看变更日志发布安全策略许可行为准则以及贡献指南

Banner

Build Status StyleCI Status Software License Packagist Downloads Latest Version

安装

此版本需要 PHP 7.4-8.3,并支持 Laravel 8-11。

要获取最新版本,请使用 Composer 引入项目。

$ composer require "graham-campbell/throttle:^10.2"

安装后,如果您没有使用自动包发现,那么您需要在 config/app.php 中注册 GrahamCampbell\Throttle\ThrottleServiceProvider 服务提供者。

您还可以选择性地别名我们的外观

        'Throttle' => GrahamCampbell\Throttle\Facades\Throttle::class,

配置

Laravel Throttle 支持可选配置。

要开始使用,您需要发布所有供应商资产

$ php artisan vendor:publish

这将创建一个 config/throttle.php 文件在您的应用中,您可以修改该文件以设置配置。同时,请确保检查该包原始配置文件在发布之间的更改。

有一个配置选项

缓存驱动器

此选项('driver')定义要使用的缓存驱动器。它可以是在 config/cache.php 中设置的任何驱动器的名称。将其设置为 null 将使用您在 config/cache.php 中设置的默认驱动器。此设置的默认值是 null

用法

节流

这是最感兴趣的类。它绑定到 ioc 容器上的 'throttle',可以通过 Facades\Throttle 外观访问。有六个有趣的公共方法。

'get' 方法将从您传递给它的 1-3 个参数创建一个新的节流器类(一个实现 Throttler\ThrottlerInterface 的类)。第一个参数是必需的,必须是 \Illuminate\Http\Request 的实例,或者是一个包含两个键的关联数组('ip' 应该是您想要节流的用户的 IP 地址,'route' 应该是您想要节流的完整 URL,但实际上,对于高级使用,可以是您选择的任何唯一键)。第二个参数是可选的,应该是一个表示在用户达到限制之前允许的最大点击次数的 int。第三个和最后一个参数应该是一个表示用户在超过限制后必须等待多长时间才能将点击计数重置为零的 int。在底层,此方法将调用节流器工厂类的 make 方法(一个实现 Factories\FactoryInterface 的类)。

其他5种方法都接受与get方法相同的参数。这里发生的情况是我们动态创建一个节流类(或者我们自动重用已经创建的实例),然后不带参数调用它。这5种方法是'attempt''hit''clear''count''check'。它们都在下面进行了说明。

Facades\Throttle

这个外观会动态地将静态方法调用传递到ioc容器中的'throttle'对象,默认情况下是Throttle类。

Throttler\ThrottlerInterface

这个接口定义了节流类必须实现的公共方法。这里的所有5种方法都不接受任何参数。

'attempt'方法将击中节流(增加击中计数),然后返回一个表示是否超出击中限制的布尔值。

'hit'方法将击中节流(增加击中计数),然后返回$this,这样您就可以进行另一个方法调用,如果需要的话。

'clear'方法将清除节流(将击中计数设置为0),然后返回$this,这样您就可以进行另一个方法调用,如果需要的话。

'count'方法将返回节流的击中次数。

'check'方法将返回一个表示是否超出击中限制的布尔值。

Throttler\CacheThrottler

这个类完全实现了Throttler\ThrottlerInterface。这是这个包中唯一提供的节流实现,由Factories\CacheFactory类创建。注意,这个类还实现了PHP的Countable接口。

Factories\FactoryInterface

这个接口定义了节流工厂类必须实现的公共方法。这样的类必须只实现一个方法。

'make'方法将从您传递给它的数据对象创建一个新的节流类(一个实现了Throttler\ThrottlerInterface的类)。这个内部接口的文档是为那些可能希望编写自己的工厂类以创建自定义节流类的先进用户提供的。

Factories\CacheFactory

这个类完全实现了Factories\FactoryInterface。这是这个包中唯一提供的节流实现,负责创建Factories\CacheFactory类。这个类仅用于Throttle类的内部使用。

Http\Middleware\ThrottleMiddleware

您可以将GrahamCampbell\Throttle\Http\Middleware\ThrottleMiddleware中间件放在路由前面以节流它们。中间件可以接受最多两个参数。这两个参数是limittime。如果您需要,可以查看此source,阅读tests,或查看Laravel的documentation

ThrottleServiceProvider

这个类不包含任何有趣的公共方法。这个类应该添加到config/app.php中的提供者数组中。这个类将设置ioc绑定。

真实示例

在这里,您可以看到这个包的使用是多么简单。

我们的第一个例子将是使用我们的默认中间件的超简单用法。这将为此url设置一个限制为10次击中和1小时保留时间的中间件。

use Illuminate\Support\Facades\Route;

Route::get('foo', ['middleware' => 'GrahamCampbell\Throttle\Http\Middleware\ThrottleMiddleware', function () {
    return 'Why herro there!';
}]);

如果我们想自定义限制怎么办?很简单!Laravel允许我们向中间件传递参数。这将为此url设置一个限制为50次击中和30分钟保留时间的中间件。

use Illuminate\Support\Facades\Route;

Route::get('foo', ['middleware' => 'GrahamCampbell\Throttle\Http\Middleware\ThrottleMiddleware:50,30', function () {
    return 'Why herro there!';
}]);

如果我们不想使用这个包提供的默认中间件怎么办?这也很简单。

use GrahamCampbell\Throttle\Facades\Throttle;
use Illuminate\Support\Facades\Request;

// now let's get a throttler object for that request
// we'll use the same config as in the previous example
// note that only the first parameter is "required"
$throttler = Throttle::get(Request::instance(), 50, 30);

// let's check if we've gone over the limit
var_dump($throttler->check());

// we implement Countable
var_dump(count($throttler));

// there are a few more functions available
// please see the previous documentation

请注意,您可以直接在工厂上调用方法,而不是调用get方法。

use GrahamCampbell\Throttle\Facades\Throttle;
use Illuminate\Support\Facades\Request;

$request = Request::instance();

// the attempt function will hit the throttle, then return check
var_dump(Throttle::attempt($request));

// so this is the same as writing
var_dump(Throttle::hit($request)->check());

// and, of course, the same as
var_dump(Throttle::get($request)->attempt());
更多信息

本包中还有其他未在此处文档化的类(例如transformers)。这是因为它们不是用于公共用途的,而是由本包内部使用的。

安全

如果您在此包中发现安全漏洞,请发送电子邮件至 security@tidelift.com。所有安全漏洞都将得到及时处理。您可以在此处查看我们的完整安全政策。

许可证

Laravel Throttle 采用MIT许可证(MIT)授权。

企业版

作为Tidelift订阅的一部分提供

graham-campbell/throttle的维护者以及成千上万的其他包的维护者正在与Tidelift合作,为您使用的构建应用程序的开源依赖项提供商业支持和维护。节省时间,降低风险,提高代码健康度,同时支付您使用的确切依赖项的维护者。了解更多信息请访问此处