check24/feature-flag-bundle

为您的symfony应用程序提供可切换的功能标志,支持多种来源,如.env、cookie等。

安装次数: 1,229

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 4

类型:symfony-bundle

1.2.0 2021-06-11 13:11 UTC

README

轻松在您的Symfony应用程序中切换功能。内置提供者包括.env、cookie和userAgent。但您可以通过自己的提供者(例如用于A/B测试)扩展系统。

安装

使用composer安装此包

composer require check24/feature-flag-bundle

用法

访问功能标志状态

限制控制器操作的访问

您可以使用IsActive注解来使动作仅在给定功能处于活动状态时才可访问。否则将抛出403错误

use Shopping\FeatureFlagBundle\Annotation\IsActive;

/**
 * @Route("test")
 * @IsActive("foobar")
 * @return Response
 */
public function test(): Response
{
    return new Response('I can see you.');
}

作为依赖注入

要访问服务内部的功能状态,您可以注入FeatureFlagInterface

use Shopping\FeatureFlagBundle\Service\FeatureFlagInterface;

class SomeService
{
    private $featureFlag;

    public function __construct(FeatureFlagInterface $featureFlag)
    {
        $this->featureFlag = $featureFlag;
    }

    public function getNumber(): int
    {
        if ($this->featureFlag->isActive('foobar')) {
            return 2;
        }

        return 1;
    }
}

In Twig

使用twig函数is_active来检查功能是否启用

{% if is_active('foobar') %}
    Awesome!
{% else %}
    Default...
{% endif %}

配置功能标志提供者

在您的config/packages/shopping_feature_flag.yaml配置中,您可以配置内置提供者,以定义当用户输入某个值时,哪个功能标志(键)应该处于活动状态

shopping_feature_flag:
    providers:
        cookie:
            values:
                test1: 1234
                test2: [5678,9999]
        userAgent:
            values:
                test: foobar/chrome
                test2: [foobar/chrome, foobar/firefox]

您可以启用/禁用一些内置提供者。

切换功能

功能标志可以通过配置的提供者进行切换。如果至少有一个提供者报告该功能处于活动状态,则该功能处于活动状态。

.env

在您的.env文件中全局切换功能。例如,您可以在生产环境的.env文件中禁用该功能,但在测试环境的.env文件中启用它。

FEATUREFLAG_FOOBAR=1

(前缀"FEATUREFLAG_"和将功能标志名称转换为大写)

Cookie

通过在浏览器中设置cookie,仅为您激活一个功能,例如在Chrome中通过F12 -> 应用程序 -> Cookies

featureFlag_foobar=1

(前缀"featureFlag_"和功能标志名称)

如果您尚未为功能标志指定特定的配置值,任何值都将激活该功能。使用配置可以使功能更安全。

User-Agent

通过在浏览器中设置自定义User-Agent,仅为您激活一个功能(例如,使用Chrome插件"User-Agent Switcher")。

shopping_feature_flag.yaml中配置,哪些User-Agent的部分激活了哪些功能

shopping_feature_flag:
    providers:
        userAgent:
            values:
                foobar: foobar/chrome

-> 当使用包含字符串foobar/chrome的User-Agent时,功能"foobar"处于活动状态。这样可以通过一个包含所有所需键的User-Agent激活多个功能,同时保留网站的浏览器/设备检测。

创建自己的提供者

如果您想以自定义方式激活功能,则需要编写自己的提供者。

在此示例中,我们创建一个基于时间的提供者,因此特定功能"morningShow"仅在上午8点到10点之间激活。

首先创建一个提供者类,实现带有isActive()方法的FeatureFlagInterface。如果给定功能处于活动状态,则此方法应返回true。否则返回false。

//src/FeatureFlagProvider/MorningProvider.php

namespace App\FeatureFlagProvider;

class MorningProvider implements FeatureFlagInterface
{
    /**
     * @param string $featureFlag
     *
     * @return bool
     */
    public function isActive(string $featureFlag): bool
    {
        if ($featureFlag !== 'morningShow') {
            return false;
        }

        $hour = (new \DateTime())->format('G');

        return $hour >= 8 && $hour <= 10;
    }
}

请记住:如果一个提供者报告功能处于活动状态,则功能处于活动状态,因此返回false不会完全禁用功能,而是会查看所有其他提供者是否报告该功能处于活动状态。

然后,使用featureFlag.provider标签标记服务

# config/services.yaml

services:
    App\FeatureFlagProvider\MorningProvider:
        tags:
            - { name: featureFlag.provider }

您就完成了。功能"morningShow"现在将在上午8点到10点之间始终处于活动状态。

您可以使用此功能实现A/B测试,因此您只为特定用户组激活功能。

环境变量处理器

要在包的配置中使用功能标志的值,您可以使用feature_flag环境变量处理器。这在与自定义功能标志提供程序结合使用时特别有用,例如,当您通过doctrine从数据库加载数据时。

# config/packages/example_foo_bundle.yaml
example_foo_bundle:
    enable_baz: '%env(feature_flag:foo_bar)%'

上述代码片段将设置ExampleBundle的enable_baz配置为名为foo_bar的功能标志的值。当您想将特定的功能标志注册为容器参数时,您也可以使用相同的技术。

# config/services.yaml

parameters:
    maintenance_mode: '%env(feature_flag:maintenance_mode)%'

$container->getParameter('maintenance_mode')现在将包含true或false,具体取决于功能标志是否处于活动状态。