rabol/laravel-simple-subscription

Laravel的简单订阅包

v0.3.2 2021-02-23 13:26 UTC

This package is auto-updated.

Last update: 2024-09-23 20:58:54 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

这是一个简单易用的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_periodinvoice_interval),则订阅将保留相同的计费日期。如果计划的计费频率不同,则订阅将具有新计划的计费频率,从更改当天开始,并且将清除订阅使用数据。此外,如果新计划有一个试用期,并且这是一个新订阅,则将应用试用期。

订阅功能使用

有多种方式可以确定用户订阅中特定功能的用法和能力,最常见的是canUseFeature

canUseFeature方法根据多个因素返回truefalse

  • 功能已启用
  • 功能值不为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)。有关更多信息,请参阅 许可文件