Laravel 10 新特性系列四:新的Pennant官方组件来进行版本标注或功能分流

105 阅读1分钟

在项目开发中,我们经常会进行A/B测试,比如发布一个新的功能,会想着先让某一部分用户使用,收集一下反馈,没有太多问题了,再大范围推广。这就叫做是一个新的feature,我们就需要想办法标注一下参与这个feature测试的部分用户。

现在这种功能,我们laravel 10可以不用自己写了,官方推出了Pennant的组件,比如要定义一个新的feature,就可以在AppServiceProvider中这样:

public function boot(): void
{
    Feature::define('beta-testers', fn (User $user) => match (true) {
        $user->isBetaTester() => true,
        default => false,
    });
}

当然,你也可以单独创建class来定义feature,比如:

class BetaTesters
{
    public function resolve(User $user): mixed
    {
        return match (true) {
            $user->isBetaTester() => true,
            default => false,
        };
    }
}

然后呢,我们就可以基于它来进行版本分流了,比如下面的代码里,我们可以让测试用户去访问v2版本的api,然后传统用户依然是走v1版本的api。

class PodcastController
{
    public function __construct(
        private readonly RedirectAction $action,
    ) {}
 
    public function index(Request $request): Response
    {
        return Feature::when(BetaTester::class,
            fn () => $this->action->handle('v2'),
            fn () => $this->action->handle('v1'),
        );
    }
}

当然了,这块逻辑也可以挪到middleware中,这样使用起来会更加优雅:

class VersionMiddleware
{
    public function handle(Request $request, Closure $next): mixed
    {
        if (Feature::active('beta-tester')) {
            return new RedirectResponse(
                uri: 'generate the url here',
            );
        }
 
        return $next($request);
    }
}

更多的使用场景,其实就靠大家发挥想象力了,因为这个组件刚发布,之后大家肯定会发挥出更多有创意的用法。

该篇是我们《Laravel 9 & 10 优雅实战入门(第三版)》这一课程的扩展文章,该课程历时6年,历经三版,是咱们国内最优雅、最正宗的laravel入门兼实战课程。

感兴趣的同学可以到我们的课程公开群做客咨询:109256050(公开课@pilishen.com)