cityhunter / laravel-pricing-plans
一个提供 Laravel 定价方案的包。
Requires
- php: >=7.3|^8.0
- ext-json: *
- illuminate/database: ^8.0
- illuminate/support: ^8.0
- nesbot/carbon: ^2.43.0
Requires (Dev)
- fakerphp/faker: ^1.13
- mockery/mockery: ^1.4.2
- orchestra/database: 6.x-dev
- orchestra/testbench: ^6.7
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
README
为您的 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
的值为Y
(Y 是正面词汇之一),则表示已启用。
有关更多详细信息,请参阅 config/plans.php
配置文件。
模型
PricingPlans 使用 7 个模型,位于命名空间 Laravel\PricingPlans\Models
下。您可以通过更改配置文件中的模型类来使用它的扩展类。
特性模型
此模型是特性的模型对象
<?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
方法的第一个参数应该是订阅的名称。如果您的应用程序提供单个订阅,您可能将其称为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
方法接受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();
检查订阅状态
为了使订阅被视为活跃,以下条件之一必须为真:
- 订阅有一个活跃的试用期。
- 订阅的
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/henoc35/laravel-pricing-plans.git /path
$ cd /path
$ composer install
$ composer phpunit
贡献
有关详细信息,请参阅CONTRIBUTING
安全
如果您发现任何与安全相关的问题,请通过电子邮件发送到Oanh Nguyen,而不是使用问题跟踪器。
鸣谢
我在2017年中旬从gerardojbaez/laraplans项目分叉并重新创建了此项目。感谢Gerardo Baez。
许可证
本项目采用MIT许可证发布。
版权所有 © 2017-2018 Oanh Nguyen。