seanstewart / plan-config
计划配置允许您轻松定义SaaS应用订阅计划的属性和限制。
Requires
- php: >=7.0
- illuminate/support: ~5.5
Requires (Dev)
- mockery/mockery: ~1.0
- orchestra/testbench: ^3.2
- phpunit/phpunit: ~6.0
README
这个Laravel 5包使您能够轻松管理SaaS应用订阅计划的规则/限制。
如何安装
使用composer要求包
composer require seanstewart/plan-config
Laravel 5.5使用包自动发现,因此无需手动添加ServiceProvider。
Laravel 5.5+
如果您不使用自动发现,请将ServiceProvider添加到config/app.php中的providers数组中
'providers' => [ Seanstewart\PlanConfig\PlanConfigServiceProvider::class ];
在app/config/app.php
中包含外观(可选)。
'aliases' => [ 'Plan' => Seanstewart\PlanConfig\Plan::class ];
然后,您需要运行命令来生成配置
php artisan vendor:publish --provider="Seanstewart\PlanConfig\PlanConfigServiceProvider"
如何使用
假设您的应用有订阅计划,限制了用户可以添加的小部件数量。您会有某种逻辑来检查用户在其账户中允许拥有的小部件数量。使用Plan Config,您可以通过调用辅助函数plan()来完成此操作。
if($this->getCurrentNumberOfWidgets < plan('limits.widgets')) { // Allow the user to add a new widget }
plan()辅助函数知道当前用户订阅的是哪个计划,并从您的plans.php配置文件中获取您定义的限制。您可以在应用程序的任何地方(视图、控制器、模型、中间件等)使用辅助函数。使用前面的示例,您的计划配置文件可能看起来像这样
'plans' => [ 'bronze' => [ 'limits' => [ 'widgets' => 5 ] ], 'silver' => [ 'limits' => [ 'widgets' => 10 ] ], //...and so on ]
如果用户订阅了银色计划,他们只能添加10个小部件。您甚至可以将其修改为使用其他属性,如计划标题、描述或定价。
'plans' => [ 'bronze' => [ 'title' => 'Bronze Plan', 'description' => 'This is some description for a Bronze Plan', 'price' => '19.00', 'currency' => 'USD', 'limits' => [ 'widgets' => 5 ] ], 'silver' => [ 'title' => 'Silver Plan', 'description' => 'This is some description for the Silver Plan', 'price' => '29.00', 'currency' => 'USD', 'limits' => [ 'widgets' => 10 ] ], //...and so on ]
获取不带用户的计划配置
在需要特定计划配置的情况下,您可以传递计划代码作为字符串的第二个参数
plan('limits.widgets', 'bronze'); // Returns 5
plan('limits.widgets', 'silver'); // Returns 10
配置您的计划
要配置您的计划,请打开app/plans.php并开始添加您的计划详情。默认情况下,该包假设您正在使用Laravel内置的Auth,并且用户的计划存储在User模型中。您可以在配置中设置用于确定用户计划的字段...
'plan_field' => 'stripe_plan'
要配置您的计划,请在'plans'数组中添加您的计划数据。
'plans' => [ 'bronze' => [ 'limits' => [ 'widgets' => 5 ] ], 'silver' => [ 'limits' => [ 'widgets' => 10 ] ], //...and so on ]
如果您有适用于所有计划的规则,您可以定义一个默认或后备计划。在配置文件中,设置您的后备计划...
'fallback_plan' => '_default',
然后在计划数组中定义_default计划。
'plans' => [ '_default' => [ 'limits' => [ 'purple_widgets' => 20 ] ] 'bronze' => [ 'limits' => [ 'widgets' => 5 ] ], 'silver' => [ 'limits' => [ 'widgets' => 10 ] ], ]
在上面的示例中,调用plan('limits.purple_widgets')将返回后备计划中的值。
或者,您可以使用外观并调用Plan::get('limits.purple_widgets')
覆盖
可以在配置中设置覆盖属性以在用户级别覆盖计划配置数据。
'overrides' => [
// The user model attribute that stores the attributes that can be changed
'user_model_attribute' => 'plan_overrides',
// The keys that are allowed to be changed. Set to all by default (['*']).
'allowed' => ['*'],
]
在上面的示例中,您将在用户模型上创建plan_overrides属性。此字段应转换为数组,并包含应覆盖给定用户的键和值列表。
示例
带有覆盖的Plan Config
'overrides' => [
'user_model_attribute' => 'plan_overrides',
'allowed' => ['limits.apples', 'limits.bananas'],
],
'plans' => [
'_default' => [
'limits' => [
'purple_widgets' => 20
]
]
'bronze' => [
'limits' => [
'widgets' => 5,
'apples' => 10,
'bananas' => 15
]
],
'silver' => [
'limits' => [
'widgets' => 10,
'apples' => 15,
'bananas' => 20
],
],
]
用户模型 plan_overrides属性
['limits.widgets' => 1, 'limits.apples' => 50, 'limits.bananas' => 100]
将产生以下结果...
如果您想返回用户的整个计划配置(包括覆盖),可以将*
作为第一个参数传递。
plan('*');
为什么我创建了它
我一直觉得管理SaaS应用的订阅和计划可能会很复杂。考虑到很多值和限制并不会经常变化,我觉得将这些值存储在数据库中并不是最佳方案。当我们构建选举跑者时,一个允许学校和机构进行选举的Web应用程序,我们需要一个东西来正好完成这项任务。希望其他人也会觉得这和我们对它一样有用!