rabol / laravel-simple-subscription
Laravel的简单订阅包
Requires
- php: ^7.4|^8.0
- illuminate/contracts: ^8.0
- spatie/laravel-package-tools: ^1.1
Requires (Dev)
- barryvdh/laravel-ide-helper: ^2.9
- friendsofphp/php-cs-fixer: ^2.18
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.9
- vimeo/psalm: ^4.4
README
这是一个简单易用的Laravel订阅包。
它受到了renvex/laravel-subscriptions包的极大启发,但更简单,且工作正常 :)
抱歉,我的意思是renvex的包似乎已被放弃。
支付
- 支付支持正在开发中,请保持关注。
- 我们很可能会使用laraveldaily/laravel-invoices,然后是一个支付包
安装
您可以通过composer安装此包
composer require rabol/laravel-simple-subscription
您可以使用以下命令发布和运行迁移
php artisan vendor:publish --provider="Rabol\SimpleSubscription\SimpleSubscriptionServiceProvider" --tag="laravel-simple-subscription-migrations" php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Rabol\SimpleSubscription\SimpleSubscriptionServiceProvider" --tag="laravel-simple-subscription-config"
这是发布后的配置文件内容
return [
];
用法
将订阅添加到您的模型中
为了简化,有一个可以添加到任何模型的特质。
最常见的用法是将订阅功能添加到User模型中,只需在User模型中使用Rabol\SimpleSubscription\Traits\HasSubscriptions
特质,如下所示
namespace App\Models; use Rabol\SimpleSubscription\Traits\HasSubscriptions; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasSubscriptions; }
这样就完成了,现在您可以在User模型上使用订阅了,只需在我们的User模型中使用这个特质!现在用户可以订阅计划。
创建一个新的计划
$newPlan = SimpleSubscriptionPlan::create([ 'name' => 'My cool subscription', 'description' => 'This is a very cool plan', 'is_active' => true, 'price' => 12.50, 'signup_fee' => 0, 'currency' => 'eur', 'trial_period' => 1, 'trial_interval' => 'week', 'invoice_period' => 1, 'invoice_interval' => 'month', 'grace_period' => 3, 'grace_interval' => 'day', ]);
添加一个功能
$planFeature = $newPlan ->features() ->create([ 'name' => 'My cool feature', 'description' => 'This is my cool feature', 'value' => 100, 'resettable_period' => 2, 'resettable_interval' => 'month', 'sort_order' => 1, ]);
订阅计划详情
$plan = SimpleSubscriptionPlan::find(1); or $plan = SimpleSubscriptionPlan::whereName('My cool subscription')->first(); // Get all plan features $plan->features; // Get all plan subscriptions $plan->subscriptions; // Check if the plan is free $plan->isFree(); // Check if the plan has trial period $plan->hasTrial(); // Check if the plan has grace period $plan->hasGrace();
获取功能值
有多种方式可以获取计划上某个功能的信息,要获取'我的酷功能'功能的值。
// Use the plan instance to get feature's value $myCoolFeatureValue = $plan->getFeatureByName('My Cool feature')->value;
获取功能使用情况
// Get the usage of the feature you can $myCoolFeatureUsage = SimpleSubscriptionPlanFeature::wherePlanId(1)->whereName('Feature 1')->first()->usage()->first()->used;
创建订阅
您可以使用在HasSubscriptions
特质中可用的newSubscription()
函数将用户订阅到一个计划。首先,获取您的订阅者模型实例,这通常是您的用户模型和用户要订阅的计划实例。获取模型实例后,您可以使用newSubscription
方法创建模型订阅。
$user = User::find(1); $plan = SimpleSubscriptionPlan::whereName('My cool subscription')->first(); $user->newSubscription($plan);
您还可以指定开始日期,如下所示
$user = User::find(1); $plan = SimpleSubscriptionPlan::whereName('My cool subscription')->first(); $user->newSubscription($plan, Carbon::today());
如果没有指定开始日期,订阅将从今天开始。结束日期由计划的设置计算得出。
更改计划
要更改计划,请这样做
$newPlan = SimpleSubscriptionPlan::whereName('My second cool plan')->first(); $subscription = SimpleSubscriptionPlanSubscription::whereName('My cool subscription')->first(); // Change subscription plan $subscription->changePlan($newPlan);
如果两个计划(当前计划和新计划)具有相同的计费频率(例如,invoice_period
和invoice_interval
),则订阅将保留相同的计费日期。如果计划的计费频率不同,则订阅将具有新计划的计费频率,从更改当天开始,并且将清除订阅使用数据。此外,如果新计划有一个试用期,并且这是一个新订阅,则将应用试用期。
订阅功能使用
有多种方式可以确定用户订阅中特定功能的用法和能力,最常见的是canUseFeature
canUseFeature
方法根据多个因素返回true
或false
- 功能已启用。
- 功能值不为0
- 或者功能有剩余的使用次数。
$user->subscription('My cool subscription')->canUseFeature('My cool feature');
用户订阅实例上的其他功能方法包括
getFeatureUsage
:返回用户使用特定功能的次数。getFeatureRemaining
:返回特定功能的可用使用次数。getFeatureValue
:返回功能值。
所有方法具有相同的签名:例如
$user->subscription('我的酷炫订阅')->getFeatureUsage('我的酷炫功能');
。
记录功能使用情况
为了有效使用能力方法,您需要跟踪每个功能的每次使用(至少是那些需要跟踪的使用)。您可以使用通过用户 subscription()
方法提供的 recordFeatureUsage
方法。
$user->subscription('My cool subscription')->recordFeatureUsage('My cool feature');
recordFeatureUsage
方法接受 3 个参数:第一个是功能的名称,第二个是添加的使用次数(默认为 1
),第三个表示添加应该是累加的(默认行为),当禁用时,使用次数将被提供的数量覆盖。例如:
// Increment by 2 $user->subscription('My cool subscription')->recordFeatureUsage('My cool feature', 2); // Override with 9 $user->subscription('My cool subscription')->recordFeatureUsage('My cool feature', 9, false);
减少功能使用情况
减少功能使用情况与增加它几乎相同。这里我们仅从实际使用中减去一个给定的数量(默认为 1
):与 recordFeatureUsage
方法的区别在于,reduceFeatureUsage
不会查看重置日期。
$user->subscription('My cool subscription')->reduceFeatureUsage('My cool feature', 2);
增加功能使用情况
增加功能使用情况与 recordFeatureUsage
几乎相同。此函数简单地给值 添加 一个给定的数量。
与 recordFeatureUsage
方法的另一个区别是,increaseFeatureUsage
不会查看重置日期。
$user->subscription('My cool subscription')->increaseFeatureUsage('My cool feature', 2);
清除订阅使用数据
$user->subscription('My cool subscription')->usage()->delete();
检查订阅状态
为了使订阅被视为活动状态,以下条件之一必须为真:
- 订阅有一个活动的试用期。
- 订阅的
ends_at
日期在未来。
$user->subscribedToPlanId($planId); or $user->subscribedToPlanName('My cool plan');
或者您可以使用订阅模型中提供的方法:
$user->subscription('My cool subscription')->active(); $user->subscription('My cool subscription')->canceled(); $user->subscription('My cool subscription')->ended(); $user->subscription('My cool subscription')->onTrial();
具有活动的试用期或
ends_at
日期在未来的已取消订阅被视为活动状态。
续订订阅
要续订订阅,您可以使用订阅模型中提供的 renew
方法。这将根据所选计划设置新的 ends_at
日期,并将清除订阅的使用数据。
$user->subscription('My cool subscription')->renew();
已结束周期的已取消订阅无法续订。
取消订阅
要取消订阅,只需在用户的订阅上使用 cancel
方法。
$user->subscription('My cool subscription')->cancel();
默认情况下,订阅将保持活动状态直至期结束,您可以通过传递 true
立即结束订阅。
$user->subscription('My cool subscription')->cancel(true);
作用域
订阅模型
// Get subscriptions by plan $subscriptions = SimpleSubscriptionPlanSubscription::byPlanId($plan_id)->get(); // Get bookings of the given user $user = \App\Models\User::find(1); $bookingsOfUser = SimpleSubscriptionPlanSubscription::ofSubscriber($user)->get(); // Get subscriptions with trial ending in 3 days $subscriptions = SimpleSubscriptionPlanSubscription::findEndingTrial(3)->get(); // Get subscriptions with ended trial $subscriptions = SimpleSubscriptionPlanSubscription::findEndedTrial()->get(); // Get subscriptions with period ending in 3 days $subscriptions = SimpleSubscriptionPlanSubscription::findEndingPeriod(3)->get(); // Get subscriptions with ended period $subscriptions = SimpleSubscriptionPlanSubscription::findEndedPeriod()->get();
测试
composer test
变更日志
有关最近更改的更多信息,请参阅 变更日志。
贡献
有关详细信息,请参阅 贡献指南。
安全漏洞
有关如何报告安全漏洞的详细信息,请参阅 我们的安全策略。
鸣谢
许可
MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件。