编程

[Laravel 扩展包]Laravel Usage Limiter:在 Laravel 中实现 SAAS 的使用限制

778 2024-09-01 00:38:00

如果你曾经使用过 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

这将在数据库中创建两个表格:limitsmodel_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 应用中实现使用限制的高级概述。你还可以执行高级操作,如使用命令安排定期重置限制、扩展该包、尝试缓存等。