logo

食谱

团队计费

Spark 默认情况下使用基于“用户”的计费。如果您的应用程序按团队或其他模型计费,则需要相应地调整 Spark 安装。我们将使用团队计费实现作为示例,在以下文档中逐步介绍这些调整。

要将 App\Models\Team 模型设为您的可计费模型,您首先需要调整 Spark 的默认迁移。

自定义迁移

首先,将 2019_05_03_000001_add_spark_columns_to_users_table.php 文件重命名为 2020_05_03_000001_add_spark_columns_to_teams_table.php。调整迁移的“年份”将确保迁移在数据库中创建 teams 表后运行。

重命名迁移后,您可以更新其内容,使其更新 teams 表而不是 users 表的表定义。此外,更新第一个列,使其在 teams 表而不是 remember_token 上的字段之后添加。

接下来,更新 subscriptions 表迁移,使其包含 team_id 而不是 user_id。您还应确保更新迁移索引中的列。

更新服务提供者

现在迁移已更新,我们应该更新 SparkServiceProvider 以引用 Team 模型而不是 User 模型。

php
use App\Models\Team;
use Laravel\Cashier\Cashier;
use Spark\Spark;

class SparkServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        // Instruct Cashier to use the `Team` model instead of the `User` model...
        Cashier::useCustomerModel(Team::class);

        // Resolve the current team...
        Spark::billable(Team::class)->resolve(function (Request $request) {
            return $request->user()->currentTeam;
        });

        // Verify that the current user owns the team...
        Spark::billable(Team::class)->authorize(function (Team $billable, Request $request) {
            return $request->user() &&
                   $request->user()->id == $billable->user_id;
        });

        Spark::billable(Team::class)->checkPlanEligibility(function (Team $billable, Plan $plan) {
            // ...
        });
    }
}

更新模型

现在我们可以更新 Team 模型以使用 Spark\Billable 特性并实现一个 stripeEmail 方法,该方法返回团队所有者的电子邮件地址,以便在 Stripe 仪表板中显示为客户标识符。

php
use Spark\Billable;

class Team extends JetstreamTeam
{
    use Billable;

    public function stripeEmail(): string|null
    {
        return $this->owner->email;
    }
}

Spark 配置文件

最后,更新应用程序的 config/spark.php 配置文件,使其定义一个 team 可计费模型。

php
use App\Models\Team;

'billables' => [
    'team' => [
        'model' => Team::class,

        'plans' => [
            // ...
        ],
    ],
]