如何在 Laravel 中实现产品试用功能(Free Trial)

Laravel 是创建「软件即服务」解决方案的良好框架-用户按月付费(功能)。通常,它应该包含某种免费试用机制。在本文中,我主要介绍一下我如何在 Laravel 5.8中做到这一点。

我们在这里创建什么

  • 我们使用默认的 Laravel 应用, 运行 artisan make:auth 生成默认的认证系统;
  • 将添加一个新的时间戳字段 users.trial_until ,默认情况下将在注册后14天内填写该字段;
  • 可以在 config/app.php 设置天数 –因为你永远不知道需求会咋么改动;
  • 实现剩余免费试用天数的标题,并带有升级到高级计划的链接(我们不在本文中介绍升级或付款,仅免费试用);
  • 检查免费试用是否结束(如果是)–显示无法关闭的引导模式,用户如果想继续,那么续费吧;

好了,可以开始下一步的工作了。

步骤1. Users 表新增 trial_until 字段

运行:

php artisan make:migration add_trial_until_field_to_users_table

在迁移文件中:

Schema::table('users', function (Blueprint $table) {
    $table->timestamp('trial_until')->nullable();
});

然后(这里并没有提到要运行迁移文件 php artisan migrate)在 app/User.php 文件中把该字段加入到 $fillable:

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'trial_until'
    ];

最后,在创建用户时我们需要填充它

/**
 * 有效注册后创建一个新的用户实例
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'trial_until' => now()->addDays(config('app.free_trial_days')),
    ]);
}

可以看到,我们使用的是可配置的值 config(‘app.free_trial_days’),因此我们可以把配置的值添加到 config/app.php 文件:

    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        // ...
        'View' => Illuminate\Support\Facades\View::class,

    ],

    'free_trial_days' => 14,

];

步骤2.标头文字和升级链接

为了显示剩余的免费试用天数,我们需要在每一页上进行计算。将其作为 app / User.php 模型的属性会很方便,因此我们将使用访问器.

public function getFreeTrialDaysLeftAttribute()
{
    // 付款后将实施的Future字段
    if ($this->plan_until) { 
        return 0;
    }

    return now()->diffInDays($this->trial_until, false);
}

现在我们可以从代码中的任意位置调用 auth()->user()->free_trial_days_left 来访问此值。

另外如果想把时间字段 $this->trial_until 转换成 Carbon,只要在 app/User.php 模型中将此字段加入到 $dates 数组中即可。

protected $dates = [
    'trial_until'
];

然后我们找到位于 resources/views/layouts/app.blade.php 的头部,添加另一个带有信息和链接的   – 请参阅 @else 指令后面的块:

@guest
    <li class="nav-item">
        <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
    </li>
    @if (Route::has('register'))
        <li class="nav-item">
            <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
        </li>
    @endif
@else
    @if (auth()->user()->free_trial_days_left > 0)
    <li class="nav-item">
        <a class="nav-link" href="/upgrade">{{ auth()->user()->free_trial_days_left }} Days of Free Trial left. Upgrade now.</a>
    </li>
    @endif
    <li class="nav-item dropdown">
        <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
            {{ Auth::user()->name }} <span class="caret"></span>
        </a>

目前,我们不会实现该/升级链接,这超出本文讨论范围。但是我们确实显示了天数。

步骤3.免费试用结束后的页面

我们将在 resources/views/layouts/app.blade.php 结尾中添加一个 @if-@else 

@if (auth()->check() && auth()->user()->free_trial_days_left < 0)
    <!-- Modal -->
    <div class="modal NO-fade"
         tabindex="-1" role="dialog" style="display: block">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h3 class="modal-title">Upgrade Plan</h3>
                </div>
                <div class="modal-body">
                    <div class="alert alert-danger">
                        Your Free Trial is over. Please choose plan to continue.
                    </div>
                    <div class="row">
                        <div class="col-md-6 offset-md-3 text-center">
                            <h4>Unlimited Plan</h4>
                            <b>$199.99 per year</b>
                            <hr />
                            - <b>Unlimited</b> AdminPanels<br />
                            - All CRUDs and Modules<br />
                            - Unlimited Functions<br />
                            - <b>Priority</b> Live-chat Support
                            <hr />
                            <a href="/upgrade" class="btn btn-lg btn-primary">Pay $199.99</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endif

</body>
</html>

查看结果:

我已经从 QuickAdminPanel.com 类似弹出窗口中获取了文本示例,你可以自定义,并从数据库或配置中获取文本。

这就是免费试用。如果本文受到关注,我可能会继续进行有关SaaS系列的付款,计划,发票等。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laraveldaily.com/laravel-saas-fr...

译文地址:https://learnku.com/laravel/t/39512

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

试用功能写好了,就差想个大家都需要的业务了

4年前 评论

点赞 + 评论支持一下,感觉以后能用上

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!