oanhnn / laravel-pricing-plans
一个提供Laravel定价计划的包。
Requires
- php: >=7.0
- illuminate/database: ~5.4
- illuminate/support: ~5.4
- nesbot/carbon: ~1.21
Requires (Dev)
- fzaninotto/faker: ^1.4
- mockery/mockery: ^0.9
- orchestra/database: ^3.4
- orchestra/testbench: ^3.4
- phpunit/phpunit: ~6.1|~7.0
- squizlabs/php_codesniffer: ^3.0
README
为您的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
的值为Y
(Y 是正面词汇之一),则表示它已启用。
请参阅 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
方法的第一个参数应该是订阅的名称。如果你的应用程序只提供单个订阅,你可能将其称为 main
或 primary
。第二个参数是用户订阅的计划实例。
订阅能力
有多种方法可以确定用户订阅中特定功能的用法和能力,最常见的是 canUse
canUse
方法根据多个因素返回 true
或 false
- 功能 已启用。
- 功能值不是
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。