ecn / featuretoggle-bundle
为您的项目添加功能开关功能
Requires
- php: ~8.0 | ~8.1
- doctrine/common: 3.2.1
- symfony/framework-bundle: ^5.4 | ^6.0
Requires (Dev)
- escapestudios/symfony2-coding-standard: ^3.12
- jetbrains/phpstorm-attributes: ^1.0
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.6
- vimeo/psalm: ~4.21
Suggests
- twig/twig: ^3.3
Conflicts
- phpunit/phpunit: <5.4.3
README
此包为您的Symfony项目添加功能开关功能。
要求
要安装ECNFeatureToggleBundle,您至少需要
- PHP 8.0 或更高版本
- Symfony 5.4 或更高版本
安装
步骤 1: 使用composer安装
$ composer require ecn/featuretoggle-bundle
Twig的功能是可选的。如果需要使用,请将其添加到composer中。
$ composer require twig/twig
步骤 2: 激活包
将包添加到AppKernel.php
<?php // in AppKernel::registerBundles() $bundles = array( // ... new Ecn\FeatureToggleBundle\EcnFeatureToggleBundle(), // ... );
配置
功能开关开发背后的理念是功能在本地定义。因此,将功能定义放在单独的配置文件中是个好主意,这个文件不应该受版本控制。
创建一个新的yml文件,例如 features.yml 并让您的SCM忽略此文件。
然后在features.yml中添加以下配置
ecn_feature_toggle: features:
将features.yml文件导入到您的配置中
imports: - { resource: features.yml, ignore_errors: true }
用法
步骤 1: 添加功能开关
在功能配置中定义一个新的功能开关
ecn_feature_toggle: features: MyNewFeature:
步骤 2: 在代码中检查功能开关
现在您可以在代码中检查是否定义了此功能。
在twig模板中
{% if feature('MyNewFeature') %} <p>Here is my new feature!</p> {% endif %}
或使用标签
{% feature MyNewFeature %} <p>Here is my new feature!</p> {% endfeature %}
在操作中
if ($this->get('feature')->has('MyNewFeature')) { // Your new feature here }
投票者
为了决定一个功能是否可用,使用投票者。目前,包括五个投票者。
AlwaysTrueVoter
这是默认投票者,它始终通过。因此,如果您定义了一个功能,它将始终显示。
使用此投票者的完整配置如下所示
ecn_feature_toggle: features: MyNewFeature: voter: AlwaysTrueVoter
因为这是默认投票者,配置中的投票者部分可以省略。
AlwaysFalseVoter
此投票者始终失败。如果您定义了一个使用此投票者的功能,它将永远不会显示。
使用此投票者的完整配置如下所示
ecn_feature_toggle: features: MyNewFeature: voter: AlwaysFalseVoter
RatioVoter
此投票者在0到1之间的给定比率上通过,这使得它适合A/B测试。默认比率为0.5。
比率越高,投票者通过的可能性就越大。值为1将使其每次都通过,值为0将使其永不通过。
此外,第一次检查的结果可以绑定到用户的会话。如果您需要功能在多个请求之间持续有效,这很有用。要启用此功能,只需将sticky设置为true。
要使用此投票者,这是完整的配置
ecn_feature_toggle: features: MyNewFeature: voter: RatioVoter params: { ratio: 0.5, sticky: false }
ScheduleVoter
此投票者在给定的时间表之后通过。
要使用此投票者,这是完整的配置
ecn_feature_toggle: features: MyNewFeature: voter: ScheduleVoter params: { schedule: '2015-10-23' }
RequestHeaderVoter
请求头名称本身设计为不区分大小写。
请求头值始终被视为字符串,因此使用等于(==)检查,而不是相同的匹配(===)。
请求头键设计为不区分大小写。
如果请求堆栈中没有当前请求,投票者将不通过。
a. 指定键/值对
此投票者仅在找到所有指定的头及其对应值并且它们等于当前请求头时通过。
键/值配置的示例
ecn_feature_toggle: features: FooRequestFeature: voter: RequestHeaderVoter params: { headers: { foo: bar, x-cdn: 'akamai', x-location: 'cn' } }
b. 仅指定请求头键
您还可以指定不带值的请求头键列表。
在这种情况下,仅检查指定的所有请求头是否存在。
所有请求头名称均按标准不区分大小写。
示例
ecn_feature_toggle: features: FooRequestFeature: voter: RequestHeaderVoter params: { headers: { x-mobile, x-foo-debug-header } }
不建议混合两种配置,因为它将配置作为键/值对处理,可能导致意外结果,并且很可能会使Voter无法通过。
重写默认的Voter
您可以像这样重写默认的Voter
ecn_feature_toggle: default: voter: RatioVoter params: { ratio: 0.1, sticky: true }
添加自己的Voter
添加Voter很简单。首先确保,您的Voter实现了
然后定义您的Voter作为服务,将其标记为ecn_featuretoggle.voter并提供一个别名
<!-- Example Voter --> <service id="ecn_featuretoggle.voter_example" class="My\Example\Voter"> <tag name="ecn_featuretoggle.voter" alias="ExampleVoter" /> </service>
测试
$ composer test
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。