olubunmitosin/laravel-pricing-plans

一个提供Laravel定价计划的包。

v0.4.3 2022-01-18 08:01 UTC

README

Build Status Coverage Status Latest Version Software License

为您的Laravel 8.+ 应用程序轻松提供定价计划。

主要功能

为您的Laravel 8.+ 应用程序轻松提供定价计划。

待办事项

  • 缓存一些查询
  • 添加单元测试脚本
  • 编写更好的文档

要求

  • php >=7.3
  • Laravel 8.+

安装

Composer

首先,通过Composer拉取包。

$ composer require cityhunter/laravel-pricing-plans

服务提供者

接下来,如果使用Laravel 8.+,则已完成。如果使用Laravel 5.4,必须在您的config/app.php文件中包含服务提供者。

// config/app.php

    'providers' => [
        // Other service providers...

        Laravel\PricingPlans\PricingPlansServiceProvider::class,
    ],

配置文件和迁移

使用以下命令发布包配置文件和迁移

$ php artisan vendor:publish --provider="Laravel\PricingPlans\PricingPlansServiceProvider"

然后运行迁移

$ php artisan migrate

契约和特性

Laravel\PricingPlans\Contacts\Subscriber契约和Laravel\PricingPlans\Models\Concerns\Subscribable特性添加到您的订阅者模型中(例如User)。

请参阅以下示例

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\PricingPlans\Contracts\Subscriber;
use Laravel\PricingPlans\Models\Concerns\Subscribable;

class User extends Authenticatable implements Subscriber
{
    use Subscribable;
    // ...
}

配置文件

您可以配置要使用的数据库表、模型以及要使用的正面词汇列表。

定义

  • 正面词汇:用于判断特定特性是否启用。例如,如果特性listing_title_bold的值为YY是正面词汇之一),则表示已启用。

请参阅config/plans.php配置文件以获取更多详细信息。

模型

PricingPlans在Laravel\PricingPlans\Models命名空间下使用7个模型。您可以通过更改配置文件中的模型类来使用其扩展类。

特性模型

此模型是特性的模型对象

<?php

namespace App\Models;

use Laravel\PricingPlans\Models\Feature as Model;

class Feature extends Model
{
    const FEATURE_UPLOAD_IMAGES = 'upload-images';
    const FEATURE_UPLOAD_VIDEO = 'upload-video';
}

计划模型

此模型是计划的模型对象

<?php
namespace App\Models;

use Laravel\PricingPlans\Models\Plan as Model;

class Plan extends Model
{
    const PLAN_FREE = 'free';
    const PLAN_PRO = 'pro';
}

分组模型

此模型是分组的模型对象

<?php
namespace App\Models;

use Laravel\PricingPlans\Models\Group as Model;

class Group extends Model
{
   
}

计划特性模型

此模型是计划和特性之间的关联模型对象

计划分组模型

此模型是计划和分组之间的关联模型对象

计划订阅模型

此模型是计划和订阅者之间的关联模型对象

计划订阅使用模型

此模型是用于计数特性使用的对象

有关更多详细信息,请参阅每个模型和Laravel\PricingPlans\Models\Concerns\Subscribable特性。

事件

事件位于Laravel\PricingPlans\Events命名空间下。以下是由包触发的事件。

SubscriptionRenewed事件

当使用renew()方法续订订阅时触发。

SubscriptionCanceled事件

当使用cancel()方法取消订阅时触发。

SubscriptionPlanChanged事件

当订阅的计划更改时触发。这将在一旦保存PlanSubscription模型时触发。计划更改是通过比较原始值和当前值的plan_id来确定的。

使用

创建特性和计划

<?php

use Laravel\PricingPlans\Models\Feature;
use Laravel\PricingPlans\Models\Plan;

$feature1 = Feature::create([
    'name' => 'Upload images',
    'code' => 'upload-images',
    'description' => null,
    'interval_unit' => 'day',
    'interval_count' => 1,
    'sort_order' => 1,
]);

$feature2 = Feature::create([
    'name' => 'upload video',
    'code' => 'upload-video',
    'description' => null,
    'interval_unit' => 'day',
    'interval_count' => 1,
    'sort_order' => 2,
]);

$plan = Plan::create([
    'name' => 'Pro',
    'code' => 'pro',
    'description' => 'Pro plan',
    'price' => 9.99,
    'interval_unit' => 'month',
    'interval_count' => 1,
    'trial_period_days' => 5,
    'sort_order' => 1,
]);

$plan->features()->attach([
    $feature1->id => ['value' => 5, 'note' => 'Can upload maximum 5 images daily'],
    $feature2->id => ['value' => 1, 'note' => 'Can upload maximum 1 video daily'],
]);

创建一组计划

<?php

use Laravel\PricingPlans\Models\Group;
use Laravel\PricingPlans\Models\Plan;

$plan1 = Plan::create([
    'name' => 'Pro',
    'code' => 'pro',
    'description' => 'Pro plan',
    'price' => 19.9,
    'interval_unit' => 'month',
    'interval_count' => 1,
    'trial_period_days' => 15,
    'sort_order' => 1,
]);

$plan2 = Plan::create([
    'name' => 'Free',
    'code' => 'Free',
    'description' => 'Free plan',
    'price' => 0,
    'interval_unit' => 'month',
    'interval_count' => 1,
    'trial_period_days' => 30,
    'sort_order' => 1,
]);

$group = Group::create([
    'name' => 'Service1',
    'description' => "Service 1 plan group description"
]);

$group->plans()->attach([
    $plan1->id => ['created_at' => now()],
    $plan2->id => ['created_at' => now()],
]);

创建订阅

您可以使用位于 Subscribable 特性中的 newSubscription() 函数将用户订阅到计划。首先,检索您用户模型的实例,这通常是您正在订阅的用户模型以及用户要订阅的计划实例。一旦检索到模型实例,您就可以使用 newSubscription 方法创建模型的订阅。

<?php

use Illuminate\Support\Facades\Auth;
use Laravel\PricingPlans\Models\Plan;

$user = Auth::user();
$plan = Plan::code(Plan::PLAN_PRO)->firstOrFail();

$user->newSubscription('main', $plan)->create();

newSubscription 方法的第一个参数应该是订阅的名称。如果您的应用程序提供单个订阅,您可能将其称为 mainprimary。第二个参数是用户订阅的计划实例。

订阅能力

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

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

  • 功能 已启用
  • 功能值不是 0
  • 或者功能有剩余的使用次数。
$user->subscription('main')->ability()->canUse(Feature::FEATURE_UPLOAD_IMAGES);

其他方法包括

  • enabled:当功能值是配置文件中列出的 正词 时返回 true
  • consumed:返回用户使用特定功能的次数。
  • remainings:返回特定功能的可用使用次数。
  • value:返回功能值。

所有方法具有相同的签名:例如。
$user->subscription('main')->ability()->consumed(Feature::FEATURE_UPLOAD_IMAGES);.

记录特性使用

为了有效地使用能力方法,您需要跟踪每个功能的每次使用(至少是那些需要跟踪的)。您可以通过用户 subscriptionUsage() 方法使用可用的 record 方法。

$user->subscriptionUsage('main')->record(Feature::FEATURE_UPLOAD_IMAGES);

record 方法接受 3 个参数:第一个是功能的代码,第二个是添加的使用次数(默认为 1),第三个参数指示添加是否是增量(默认行为),当禁用时,使用次数将由提供的数量覆盖。例如。

// Increment by 2
$user->subscriptionUsage('main')->record(Feature::FEATURE_UPLOAD_IMAGES, 2);

// Override with 9
$user->subscriptionUsage('main')->record(Feature::FEATURE_UPLOAD_IMAGES, 9, false);

减少特性使用

减少功能使用与增加功能几乎相同。这里我们只从实际使用中 减去 给定的数量(默认为 1

$user->subscriptionUsage('main')->reduce(Feature::FEATURE_UPLOAD_IMAGES, 2);

清除订阅使用数据

$user->subscriptionUsage('main')->clear();

检查订阅状态

要使订阅被视为活跃,以下条件之一必须为 true

  • 订阅有一个活跃的试用期。
  • 订阅的 ends_at 日期在将来。
$user->subscribed('main');
$user->subscribed('main', $planId); // Check if user is using a particular plan

或者您可以使用订阅模型中提供的以下方法

$user->subscription('main')->isActive();
$user->subscription('main')->isCanceled();
$user->subscription('main')->isCanceledImmediately();
$user->subscription('main')->isEnded();
$user->subscription('main')->onTrial();

具有活跃试用期或 ends_at 日期在将来的已取消订阅被视为活跃。

续订订阅

要续订订阅,您可以使用订阅模型中提供的 renew 方法。这将根据所选计划设置新的 ends_at 日期,并 清除 订阅的使用数据。

$user->subscription('main')->renew();

更改订阅

要更改订阅,您可以使用订阅模型中提供的 changePlan 方法。这将设置新的 ends_at 日期,根据所选计划设置新的计划 ID,并 清除 订阅的使用数据。

$user->subscription('main')->changePlan($plan);

已结束期间的已取消订阅无法续订。

取消订阅

要取消订阅,只需在用户订阅上使用 cancel 方法。

$user->subscription('main')->cancel();

默认情况下,订阅将保持活跃,直到期结束,您可以通过传递 true 来立即结束订阅。

$user->subscription('main')->cancel(true);

作用域

订阅模型

<?php

use Laravel\PricingPlans\Models\PlanSubscription;

// Get subscriptions by plan:
$subscriptions = PlanSubscription::byPlan($plan_id)->get();

// Get subscription by subscriber:
$subscription = PlanSubscription::bySubscriber($user)->first();

// Get subscriptions with trial ending in 3 days:
$subscriptions = PlanSubscription::findEndingTrial(3)->get();

// Get subscriptions with ended trial:
$subscriptions = PlanSubscription::findEndedTrial()->get();

// Get subscriptions with period ending in 3 days:
$subscriptions = PlanSubscription::findEndingPeriod(3)->get();

// Get subscriptions with ended period:
$subscriptions = PlanSubscription::findEndedPeriod()->get();

变更日志

查看所有更改日志,请参阅 CHANGELOG

测试

$ git clone git@github.com/henoc35/laravel-pricing-plans.git /path
$ cd /path
$ composer install
$ composer phpunit

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

使用问题跟踪器。

致谢

我在 2021 年后期从 henoc35/laravel-pricing-plans 项目中分叉并重新创建了此项目。感谢 Djabia Henoc

许可

本项目采用MIT许可证发布。
版权所有 © 2017-2018 Oanh Nguyen