编程

Laravel Pennant

723 2023-02-15 01:12:27

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);
    }
}

正如你所能想象的,你能用这个软件包做什么,只会受限于你的想象力。我迫不及待地想使用这个软件包,看看它能为我的应用程序添加哪些改进。