seanstewart/plan-config

计划配置允许您轻松定义SaaS应用订阅计划的属性和限制。

1.5.0 2019-12-12 14:30 UTC

This package is auto-updated.

Last update: 2024-09-13 00:22:23 UTC


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应用程序,我们需要一个东西来正好完成这项任务。希望其他人也会觉得这和我们对它一样有用!