Laravel Pennant
Laravel Pennant 是由 Laravel 团队创建的一个包,它将随 Laravel 10 一起提供。它为您的应用程序提供了 Feature Flag。
Feature flags 使您能够自信地逐步推出新的应用程序功能,A/B 测试新的界面设计,补充基于主干的开发策略,等等。
该软件包是核心团队提供的官方软件包阵容中的最新软件包,这意味着我们现在拥有一个构建良好、测试良好的软件包,为我们提供了一些很棒的功能。
分解软件包的功能,我们可以了解这个软件包给我们带来了什么。
用 AppServiceProvider
来定义创建新特性,是定义它的简单过程,如下所示:
public function boot(): void
{
Feature::define('beta-testers', fn (User $user) => match (true) {
$user->isBetaTester() => true,
default => false,
});
}
这是一种在应用中定义功能的非常干净和简单的方法。但是,你也可以使用基于类来实现功能:
class BetaTesters
{
public function resolve(User $user): mixed
{
return match (true) {
$user->isBetaTester() => true,
default => false,
};
}
}
查阅文档后,我发现可以使用许多令人兴奋的方法。让我们看看文档中的一个示例,看看我们可以用它做什么。
class PodcastController
{
public function index(Request $request): Response
{
return Feature::when(NewApi::class,
fn () => $this->resolveNewApiResponse($request),
fn () => $this->resolveLegacyApiResponse($request),
);
}
}
这对于版本化的 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'),
);
}
}
我们可以根据用户是否是 beta 测试人员,使用我们的操作重定向到正确的 API 路由。我们可以将其移动到更高的中间件层,以使其更简单。
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);
}
}
正如你所能想象的,你能用这个软件包做什么,只会受限于你的想象力。我迫不及待地想使用这个软件包,看看它能为我的应用添加哪些改进。