check24 / feature-flag-bundle
为您的symfony应用程序提供可切换的功能标志,支持多种来源,如.env、cookie等。
Requires
- php: ^7.2|^8.0
- doctrine/annotations: ^1.6
- symfony/config: >=4.3 <6.0
- symfony/dependency-injection: >=4.3 <6.0
- symfony/framework-bundle: >=4.3 <6.0
- symfony/http-kernel: >= 4.3 <6.0
- twig/twig: >=2.5 <4.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.13
- phpstan/phpstan: ^0.12.9
This package is not auto-updated.
Last update: 2024-09-18 16:08:04 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,具体取决于功能标志是否处于活动状态。