Laravel 10 的新组件:Laravel Pennant

Laravel Pennant 是由 Laravel 团队创建的一个包,它将随 Laravel 10 一起提供,为您的应用程序提供功能标志。

功能标志使您能够自信地逐步推出新的应用程序功能、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);
    }
}

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

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

原文地址:https://laravel-news.com/laravel-pennant

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

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 10

这个包是用在下面这种场景的吧

不使用拓展包:

$user  = User::find(1);
if ($user->isAdmin()) {
    // 业务代码A
} else {
   // 业务代码B
}

使用拓展包:

Feature::when('is_admin', [$this, 'doSomeA'], [$this, 'doSomeB']);

然后围绕着特性开关的逻辑判断再做一些优化

1年前 评论
Leesinyii 1年前
WHOAMI_ 1年前

完全没懂这个包是干嘛的 :joy:,哪位大哥能简单描述一下

1年前 评论
Diudiuuuu 1年前
relax_tortoise 1年前

不懂有什么用呢?

1年前 评论
黑将军

我也没看懂这个包是干啥的,感觉是测试包 :joy:

1年前 评论

我也没有看明白有什么用?

1年前 评论

这个包是用在下面这种场景的吧

不使用拓展包:

$user  = User::find(1);
if ($user->isAdmin()) {
    // 业务代码A
} else {
   // 业务代码B
}

使用拓展包:

Feature::when('is_admin', [$this, 'doSomeA'], [$this, 'doSomeB']);

然后围绕着特性开关的逻辑判断再做一些优化

1年前 评论
Leesinyii 1年前
WHOAMI_ 1年前

没看懂,感觉生态还不错的样子

1年前 评论

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