olubunmitosin / 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
- php-parallel-lint/php-parallel-lint: ^1.2
- phpro/grumphp: ^1.3
- 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在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 方法的第一个参数应该是订阅的名称。如果您的应用程序提供单个订阅,您可能将其称为 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();
检查订阅状态
要使订阅被视为活跃,以下条件之一必须为 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。