在项目开发中,我们经常会进行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)