Laravel Spark - 定义免费计划

Laravel Spark - Defining a free plan

我正在使用 Laravel Spark Next 并且我正在尝试创建一个免费计划。我的应用程序向用户“按席位”收费(项目数)

但是,我的申请将始终包含一个免费项目。这意味着我需要提供两种方案:一种免费,一种付费

在我的 SparkServiceProvider 中,我添加了这个:

Spark::billable(User::class)->chargePerSeat('lejemål', function (User $billable) {
    $projects = return $billable->projects()->count();
    
    //The first project is always free.
    return match ($projects) {
        0, 1 => 0,
        default => $leases,
    };

});

据我了解,“chargePerSeat”方法只是计算向用户收费的价格。所以在这种情况下,如果用户有 0 或 1 个项目并选择订阅,则要支付的价格为零(理应如此)。

但是,我正在尝试了解免费计划的运作方式。在经典的 Spark 中,我们可以在配置中定义一个“免费计划”。

当用户创建项目时,我根据 documentation:

添加了 subscribed 中间件
Route::get('projects/create', CreateProject::class)
        ->name('projects.create')
        ->middleware('subscribed');

看起来这个中间件只是检查是否有活动订阅。如果没有,它会将用户重定向到 /billing 页面。但是,如果用户只是想继续使用免费计划,he/she 不需要创建有效订阅。

如何使用 Laravel Spark Next 提供“免费计划”?

虽然我的解决方案没有使用“按席位”定价模式,但您可以通过这种方式了解如何创建“免费”计划。

我本来是wrote it on my blog,但我会把重要的部分写在这里。

您需要在 config/spark.php 文件中创建一个“免费”计划。


// ...

  'plans' => [
      [
          'name' => 'Free',
          'short_description' => 'This is the free plan',
          // Random _(not used by other plans)_ ID
          'monthly_id' => 1000,
          'features' => [
              '1 Project',
          ],
          'options' => [
              'projects' => 1,
          ],
          // IMPORTANT
          'archived' => true,
      ],

      // Other plans...
  ]

// ...

然后在你的“用户”模型上实现一个方法。

此方法将获取当前用户的套餐,如果用户没有活动套餐,则获取“免费”套餐。

有效地回到“免费”计划。


// ...

    public function getPlan()
    {
        $plan = $this->sparkPlan();

        if ($plan !== null) {
            return $plan;
        }

        // Fallback to "Free" plan
        $plan = Spark::plans('user')->firstWhere('name', '=', 'Free');

        return $plan;
    }

// ...

然后您就可以通过您的应用程序使用它了。

$user = User::find(1);

$plan = $user->getPlan();

$plan->name; // "Free"

$plan->options['projects']; // 1

我建议您阅读我的 blog post,以便更好地理解其工作原理,但这是要点。

奥利弗,希望这对你有帮助。