rlaravel / plans
创建计划和订阅
Requires
- ramsey/uuid: ^3.9
Requires (Dev)
- orchestra/testbench: ^4.0
README
Composer
$ composer require rlaravel/plans
服务提供者
将 RLaravel\Plans\Providers\PlansServiceProvider::class
添加到您的应用程序服务提供者文件 config/app.php
中。
'providers' => [ /** * Third Party Service Providers... */ RLaravel\Plans\Providers\PlansServiceProvider::class, ];
配置文件和迁移
使用以下命令发布包配置文件和迁移:
$ php artisan vendor:publish --provider="RLaravel\Plans\Providers\PlansServiceProvider"
然后执行迁移
$ php artisan migrate
特质和合约
将特质 RLaravel\Plans\Traits\PlanSubscriber
和合约 RLaravel\Plans\Contracts\PlanSubscriberInterface
添加到您的 User
模型。
查看以下示例
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use RLaravel\Plans\Contracts\PlanSubscriberInterface; use RLaravel\Plans\Traits\PlanSubscriber; class User extends Authenticatable implements PlanSubscriberInterface { use PlanSubscriber;
使用方法
创建计划
use RLaravel\Plans\Models\Plan; use RLaravel\Plans\Models\PlanFeature; $plan = Plan::create([ 'name' => 'Pro', 'description' => 'Pro plan', 'price' => 9.99, 'interval' => 'month', 'interval_count' => 1, 'trial_period_days' => 15, 'sort_order' => 1, ]); $plan->features()->saveMany([ new PlanFeature(['code' => 'listings', 'value' => 50, 'sort_order' => 1]), new PlanFeature(['code' => 'pictures_per_listing', 'value' => 10, 'sort_order' => 5]), new PlanFeature(['code' => 'listing_duration_days', 'value' => 30, 'sort_order' => 10]), new PlanFeature(['code' => 'listing_title_bold', 'value' => 'Y', 'sort_order' => 15]) ]);
访问计划特性
在某些情况下,您可能需要访问特定计划中的特定功能,可以使用模型 Plan
中可用的方法 getFeatureByCode
来实现。
示例
$feature = $plan->getFeatureByCode('pictures_per_listing'); $feature->value // Obtener el valor de la característica
创建订阅
首先,获取您的订阅者模型实例,通常是您的用户模型和一个您要订阅的计划实例。获取模型实例后,可以使用特质 PlanSubscriber
中的 newSubscription
方法(可用于模型)来创建模型订阅。
use Auth; use RLaravel\Plans\Models\Plan; $user = Auth::user(); $plan = Plan::find(1); $user->newSubscription('main', $plan)->create();
newSubscription
方法的第一个参数是订阅名称。如果您的应用程序提供唯一的订阅,可以将其命名为 main
或 primary
。订阅名称不是计划的名称,是一个唯一的订阅标识符。第二个参数是要订阅的用户所在的计划实例。
订阅解析
当在订阅者模型中使用 subscription()
方法(即 $user->subscription('main')
)来获取订阅时,将收到由订阅者创建的最新订阅及其名称。例如,如果 Jane Doe 订阅了 免费计划,然后订阅了 专业计划,则包将返回包含 专业计划 的订阅,因为这是最新的可用订阅。如果您有不同的要求,可以使用自己的订阅解析,将 RLaravel\Plans\Contracts\SubscriptionResolverInterface
的实现绑定到 service container
;如同以下文档所述:
https://documentacion-laravel.com/container.html#introduction
/** * Register the application services. * * @return void */ public function register() { $this->app->bind(SubscriptionResolverInterface::class, CustomSubscriptionResolver::class); }
订阅能力
有几种方法可以确定用户订阅中特定功能的用途和能力,最常见的是 canUse
canUse
方法返回 true
或 false
,取决于多个因素
- 特性 是否启用
- 特性的值不是
0
。 - 或者特性还有剩余使用次数
$user->subscription('main')->ability()->canUse('listings');
还有其他方法来确定订阅的能力
enabled
:当特性的值是配置文件中列出的 正词 时返回true
。consumed
:返回用户特定特性使用的次数。remainings
:返回特定特性的可用使用次数。value
:返回特性的值。
所有方法都有相同的签名:$user->subscription('main')->ability()->consumed('listings');
。
功能使用记录
为了有效地使用能力方法,您需要跟踪基于使用情况的功能的每次使用。您可以通过用户方法 SubscribeUsage
使用 record
方法。
$user->subscriptionUsage('main')->record('listings');
方法 record
接受 3 个参数:第一个是函数代码,第二个是添加使用的数量(默认值为 1
),第三个参数指示是否应增加使用(true
:默认行为)或覆盖(false
)。
查看以下示例
// Incremento por 2 $user->subscriptionUsage('main')->record('listings', 2); // Anular con 9 $user->subscriptionUsage('main')->record('listings', 9, false);
减少功能使用
减少功能使用几乎等同于增加。在这种情况下,我们只从实际使用中减去一个给定数量(默认值为 1
)
// Reducir en 1 $user->subscriptionUsage('main')->reduce('listings'); // Reducir en 2 $user->subscriptionUsage('main')->reduce('listings', 2);
删除订阅的使用数据
在某些情况下,您可能需要删除特定用户订阅中的所有使用,可以使用 clear
方法实现此操作
$user->subscriptionUsage('main')->clear();
检查订阅状态
要使订阅被认为是 active,订阅必须有一个活动的测试版本,或者 ends_at
在未来。
$user->subscribed('main'); $user->subscribed('main', $planId); // Compruebe si la suscripción está activa Y utilizando un plan particular
或者,您可以使用订阅模型中可用的以下方法
$user->subscription('main')->isActive(); $user->subscription('main')->isCanceled(); $user->subscription('main')->isCanceledImmediately(); $user->subscription('main')->isEnded(); $user->subscription('main')->isOnTrial();
.. 警告 :: 取消订阅且具有活动测试或 ends_at
在未来的订阅被认为是活动的。
更新订阅
要更新订阅,您可以使用订阅模型中可用的 renew
方法。这将根据所选计划设置新的 ends_at
日期,并 删除订阅的使用数据。
$user->subscription('main')->renew();
.. 警告 :: 已结束期限的取消订阅无法更新。
当使用 renew
方法更新订阅时,将激活 RLaravel\Plans\Events\SubscriptionRenewed
事件。
取消订阅
要取消订阅,只需在用户订阅中使用 cancel
方法即可。
$user->subscription('main')->cancel();
默认情况下,订阅将保持活动状态,直到期限结束。将 true
传递给 immediately 以立即取消订阅。
$user->subscription('main')->cancel(true);
事件
以下是由包触发的事件
RLaravel\Plans\Events\SubscriptionCreated
:在创建订阅时激活。RLaravel\Plans\Events\SubscriptionRenewed
:当使用renew()
方法更新订阅时激活。RLaravel\Plans\Events\SubscriptionCanceled
:使用cancel()
方法取消订阅时激活。RLaravel\Plans\Events\SubscriptionPlanChanged
:在更改订阅计划时触发;在保存PlanSubscription
模型后激活。计划更改是通过比较plan_id
的原始值和当前值来确定的。
Eloquent Scopes
use RLaravel\Plans\Models\PlanSubscription; // Obtenga suscripciones por plan: $subscriptions = PlanSubscription::byPlan($plan_id)->get(); // Obtener suscripción por usuario: $subscription = PlanSubscription::byUser($user_id)->first(); // Obtenga suscripciones con prueba que termina en 3 días: $subscriptions = PlanSubscription::findEndingTrial(3)->get(); // Obtenga suscripciones con prueba finalizada: $subscriptions = PlanSubscription::findEndedTrial()->get(); // Obtenga suscripciones con período que termina en 3 días: $subscriptions = PlanSubscription::findEndingPeriod(3)->get(); // Obtenga suscripciones con período finalizado: $subscriptions = PlanSubscription::findEndedPeriod()->get();