[Laravel 扩展包]Laravel Usage Limiter:在 Laravel 中实现 SAAS 的使用限制
如果你曾经使用过 SaaS 模型,你会熟悉使用限制的概念。这是任何 SaaS 产品最重要的指标。
使用限制本质上是可以让你根据用户订阅的计划计算出他们可以使用你的产品的次数。
例如,如果你有一个计划,允许用户每月使用 100 次产品,你可以将使用限制设置为 100。一旦用户使用了 100 个单位,他们就不能再使用该产品了。要继续使用该产品,他们可能需要升级到更高的计划。
Laravel Usage Limiter
Laravel Usage Limiter 是一个允许你在 Laravel 应用中轻松实现使用限制的包。它可以通过在模型(通常是 User
模型)上设置使用来跟踪、限制和约束使用情况。
它有以下特性:
- 定义每个计划的使用限制
- 为每个限制设置重置频率
- 将使用限制附加到模型 (e.g.
User
模型) - 每当创建或删除资源时,消耗和不消耗使用限制
- 获取特定模型的使用报告(e.g.
User
模型) - 检查某个模型能否消费更多资源
- 手动重置模型已消费的使用限制
- 通过设置重置频率(如每秒、每分钟、每小时、每天、每月等)自动重置消耗的使用限制,并安排内置的
artisan
命令
安装
使用 Composer 安装该包,将其添加到项目依赖中:
composer require nabilhassen/laravel-usage-limiter
安装完后,你需要使用以下命令发布包的配置文件。
php artisan vendor:publish --provider="NabilHassen\LaravelUsageLimiter\ServiceProvider"
这会在 Laravel 项目中发布 config/limit.php
配置文件。你可以在其中配置表格名称,关联等。
最后,运行迁移命令,创建数据库表格。
php artisan migrate
这将在数据库中创建两个表格:limits
和 model_has_limits
。
使用
现在,在不深入探讨的情况下,我将通过一个示例向你展示这个包是如何工作的。你可以查看其存储库以了解更多详细信息。
所以,假设你有一个 User
模型,代表应用中的用户。你希望将用户对资源(如产品)的使用限制在一定数量。例如,对于某个计划,用户每月只能使用 100 个单位的产品。假设该计划被称为 basic 计划,数量为 100 个单位。
你需要为此计划设定一个限额。
你可以这样创建它。
$limit = Limit::create([
'name' => 'products',
'allowed_amount' => 100,
'plan' => 'basic',
'reset_frequency' => 'every month',
]);
这将使用名称 products
创建一个新的限制,允许数量为 100,计划名为 basic
,重置频率为每月(every month
),即每月重置限制次数。
你也可以使用命令创建。
php artisan limit:create products 100 basic
这将在 limit
表中创建一个具有给定名称、允许金额、计划和重置频率的限额。
接下来,你需要将 HasLimits
trait 添加到你想要限制其使用的 User
模型中。
use NabilHassen\LaravelUsageLimiter\Traits\HasLimits;
class User extends Authenticable
{
use HasLimits;
}
然后,你可以通过传递 limit 和 plan 名来设置使用限额。T
$user = User::find(1);
$user->setLimit(limit: 'products', plan: 'basic');
一旦设置了用户的限额,你就可以通过调用 useLimit
方法开始消费限额。
// This will consume 1 unit of the limit and
// update the consumed amount in the database
$user->useLimit(limit: 'products', plan: 'basic');
// This will consume 10 units of the limit
$user->useLimit(limit: 'products', plan: 'basic', 10);
你可以像这样检查用户的剩余限额。
// This will return 90 if the plan limit is 100
// and the user has consumed 10 units
$user->remainingLimit(limit: 'products', plan: 'basic'); // 90
如果你想检查用户是否有足够限额,可以这样做:
$user->hasEnoughLimit(limit: 'products', plan: 'basic'); // true
你可以调用 resetLimit
方法,重置用户的限额。
$user->resetLimit(limit: 'products', plan: 'basic');
你可以像这样获取用户的限额报告。
$user->limitUsageReport(limit: 'products', plan: 'basic');
/*
array:1 [▼ // routes/web.php:34
"products" => array:3 [▼
"allowed_amount" => "100.0000"
"used_amount" => "10.0000"
"remaining_amount" => "90.0000"
]
]
*/
甚至还有一个便捷的 Blade 指令用来检查用户是否有足够限额。
@limit($user, 'products', 'basic')
// user has enough limits left
@else
// user has NO enough limits left
@endlimit
结语
这是对如何使用此包在 Laravel 应用中实现使用限制的高级概述。你还可以执行高级操作,如使用命令安排定期重置限制、扩展该包、尝试缓存等。