rlaravel/plans

创建计划和订阅

v1.2.2 2020-04-08 23:16 UTC

This package is auto-updated.

Last update: 2024-09-29 05:09:33 UTC


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 方法的第一个参数是订阅名称。如果您的应用程序提供唯一的订阅,可以将其命名为 mainprimary。订阅名称不是计划的名称,是一个唯一的订阅标识符。第二个参数是要订阅的用户所在的计划实例。

订阅解析

当在订阅者模型中使用 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 方法返回 truefalse,取决于多个因素

  • 特性 是否启用
  • 特性的值不是 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();