friendsofcat/laravel-feature-flag

Laravel 特性开关

4.2.2 2023-02-01 19:48 UTC

README

CI-CD

概述

您可以在这里找到关于这个库的全面博客文章。这个项目仍在开发中。

我们正在努力在应用程序中使用特性开关或切换。首先,我们希望始终在主线分支上工作,因此这将是一个关键的编码纪律,使用特性开关可以隐藏正在开发的功能,知道它不会与应用程序冲突。例如,如果热修复或另一个功能准备就绪,可以将其推送到生产,而不用担心正在开发的功能。

在核心中,我们使用这个库Atriedes/feature,因为它具有考虑常见特性开关状态所需的逻辑,例如用户、用户组、开、关、组、管理员、内部、随机等。然而,我们也在其中混合了一些不错的 Laravel 授权 特性,因此您可以做一些事情,比如

在 blade 模板中

@can('feature-flag', 'add-twitter-field')
<!-- code here -->
@endcan

或者在 PHP 中

if (Gate::allows('feature-flag', 'awesome-feature')) {
    <!-- code here -->
}
if (Gate::denies('feature-flag', 'awesome-feature')) {
    <!-- code here -->
}

如果您需要将特性开关传递给前端 JS 框架(如 Angular 或 Vue.js),您可以通过使用 FeatureFlagsForJavascript::get() 静态方法来实现。

这使用了这个库https://github.com/laracasts/PHP-Vars-To-Js-Transformer 来将这些信息放入 windows 对象中,对于 Angular,$window 现在可以访问它了

JavaScript::Put(
            [
                'pusher_public_key' => env('PUSHER_PUBLIC'),
                'feature_flags'     => FeatureFlagsForJavascript::get()
            ]
        );

安装

使用 composer 安装包

composer require "friendsofcat/laravel-feature-flag"

将以下内容添加到您的 config/app.php 提供者数组中

FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider::class,

发布包迁移

php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider" --tag='migrations'

然后运行迁移以设置基本表

php artisan migrate

此包创建了许多路由。它们可以通过发布视图来覆盖

php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider" --tag='views'

然后,将文件放置在 resources/vendors/laravel-feature-flags 中。请注意,视图 @extends('layouts.default'),因此如果您的布局不同,您将需要调整发布的视图文件。

接下来,发布配置

php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\FeatureFlagsProvider" --tag='config'

重要:默认情况下,路由由 'auth' 中间件投影,但您应该检查您的安装以确保权限可接受。中间件设置可在 'config/laravel-feature-flag.php' 文件中进行配置。

确保也为布局设置 default_view

config/laravel-feature-flag.php

您的 .env 文件

LARAVEL_FEATURE_FLAG_VIEW="layouts.default"

使用

访问 /admin/feature_flags 通过 UI 管理功能。

检查特性开关是否存在

为此,您可以使用 exists() 方法

if(\FriendsOfCat\LaravelFeatureFlags\Feature::exists('see-twitter-field'))
{
  //do something
}

为用户角色启用

您可以通过在配置表单中使用 roles 变体来为特定用户角色启用特性开关

例如

{ "roles": ["admin", "dev"]}

如果您在用户模型中没有 roles 属性,您只需要实现 FeatureFlagsEnabler 接口并使用 FeatureFlagUserRoleTrait

use FriendsOfCat\LaravelFeatureFlags\FeatureFlagsEnabler;
use FriendsOfCat\LaravelFeatureFlags\FeatureFlagUserRoleTrait;

class User extends Authenticatable implements FeatureFlagsUserRoles
{
    use AuthenticableTrait, FeatureFlagUserRoleTrait;
}

为用户团队启用

您可以通过在配置表单中使用 teams 变体来为特定用户团队启用特性开关

例如

{ "teams": ["Team 1", "Team 2"]}

如果您在用户模型中没有 teams 属性,您只需要实现 FeatureFlagsEnabler 接口并使用 FeatureFlagUserRoleTrait

use FriendsOfCat\LaravelFeatureFlags\FeatureFlagsEnabler;
use FriendsOfCat\LaravelFeatureFlags\FeatureFlagUserRoleTrait;

class User extends Authenticatable implements FeatureFlagsUserRoles
{
    use AuthenticableTrait, FeatureFlagUserRoleTrait;
}

非认证使用

有时您不是在 Auth 用户级别使用它,对于大多数我们的用例来说,这很少见,但对于非认证情况,您可以直接使用这个

if(\FriendsOfCat\LaravelFeatureFlags\Feature::isEnabled('see-twitter-field'))
{
  //do something
}

请记住,您需要将此内容放入数据库中,因此它是开启或关闭的。您可能没有用户界面,这可能是一个例如微服务的例子,因此只需将状态迁移到数据库中即可。

$feature = new FeatureFlag();
$feature->key = "see-twitter-field";
$feature->variants = "on"; //or "off"
$feature->save();

现在,当FeatureFlag Provider实例化时,它将此设置为“世界”状态,您可以通过isEnabled "on"为true和"off"为false来访问它。

同步开关

可以使用提供的feature-flag:sync命令同步功能标志。这将同步在laravel-feature-flag.php配置文件中定义的sync_flags配置中的标志。此标志配置的格式为"key => 默认值"。默认情况下,任何被删除的标志都将从存储中删除。有一个--skip-cleanup标志可以跳过此步骤。

演示/示例

如果您想尝试演示/示例,也请在您的config/app.php提供者数组中包含以下内容:

FriendsOfCat\LaravelFeatureFlags\ExampleFeatureProvider::class

然后运行

php artisan vendor:publish --provider="FriendsOfCat\LaravelFeatureFlags\ExampleFeatureProvider" --tag='migrations'
php artisan migrate

它有一个回滚功能,可以帮助清理。

有一个名为/admin/feature_flags/example的虚拟路由,您可以访问它,它将显示它未开启。但如果你然后转到管理员UI /admin/feature_flags,您可以切换它开启或关闭。

测试

辅助包

有一个设置页面,我对该包安装后可以运行的Laravel测试做了一些。

如果您试图测试在工作中的使用,您可以在测试类中使用辅助特质。

    use DatabaseTransactions, \FriendsOfCat\LaravelFeatureFlags\FeatureFlagHelper;

然后从那里工厂出您的添加和状态,然后重新注册世界。

    /**
     * @test
     */
    public function should_fail_validation_since_twitter_missing()
    {
        //Make a form request
        //Set validation on that related to twitter field
        //make sure the feature flag is on

        $user_id = Rhumsaa\Uuid\Uuid::uuid4()->toString();

        $user = factory(\App\User::class)->create([
            'id' => $user_id,
            'is_admin' => 1
        ]);

        $this->actingAs($user);

        factory(\FriendsOfCat\LaravelFeatureFlags\FeatureFlag::class)->create(
            [
                'key' => 'add-twitter-field',
                'variants' => 'on'
            ]
        );

        $this->registerFeatureFlags();
        ////
    }

待办事项

  • 使用模型事件来完成这项工作
  • 功能标志设置的缓存和更改时更新缓存
  • 显示如何在菜单和其他区域中工作,例如包含和提供者