oanhnn/laravel-pricing-plans

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

v0.3.3 2018-08-09 12:01 UTC

This package is auto-updated.

Last update: 2024-09-08 06:29:08 UTC


README

Build Status Coverage Status Latest Version Software License

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

主要功能

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

待办事项

  • 缓存一些选择查询
  • 添加单元测试脚本
  • 制作更好的文档

需求

  • php >=7.0
  • Laravel 5.4+

安装

Composer

首先,通过Composer引入包。

$ composer require oanhnn/laravel-pricing-plans

服务提供者

接下来,如果使用Laravel 5.5+,则已完成。如果使用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 下使用5个模型。您可以通过更改配置文件中的模型类来使用其扩展类。

功能模型

此模型是功能的模型对象

<?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';
}

计划功能模型

此模型是计划与功能之间的关联模型对象

计划订阅模型

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

计划订阅使用模型

此模型用于计算功能使用情况的对象

有关更多详细信息,请参阅每个模型和 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'],
]);

创建订阅

您可以使用 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 方法接受三个参数:第一个是功能的代码,第二个是要添加的使用次数(默认为 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();

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

取消订阅

要取消订阅,只需在用户的订阅上使用 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/oanhnn/laravel-pricing-plans.git /path
$ cd /path
$ composer install
$ composer phpunit

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

如果您发现任何安全问题,请通过电子邮件发送给 Oanh Nguyen 而不是使用问题跟踪器。

致谢

我在2017年中旬从 gerardojbaez/laraplans 项目分支并重新创建了此项目。感谢 Gerardo Baez

许可

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