长号 / 功能开关
功能开关基础设施,实现持续部署
Requires
- php: >=8.1
- beberlei/assert: >=3.2
- doctrine/dbal: >=3.8
- psr/log: >=1.1
- symfony/config: >=5.4
- symfony/console: >=5.4
- symfony/expression-language: >=5.4
Requires (Dev)
- ext-sqlite3: *
- doctrine/orm: >=2.19
- jangregor/phpstan-prophecy: ^1.0
- phpspec/prophecy-phpunit: ^2.0
- phpstan/extension-installer: ^1.2
- phpstan/phpstan: ^1.9
- phpstan/phpstan-beberlei-assert: ^1.0
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.5
- symfony/dependency-injection: >=5.4
- symfony/http-kernel: >=5.4
Suggests
- doctrine/orm: To benefit from automatic schema creation
- symfony/dependency-injection: To use the provided bundle
- symfony/http-kernel: To use the provided bundle
README
trompette/feature-toggles
此PHP库实现了一个功能开关基础设施。
使用 trompette/feature-toggles 库可以帮助团队迭代和安全地将新功能交付给用户,换句话说:它实现了持续部署。
有关此主题的更多信息,请参阅 功能开关(又称功能标志) 在 MartinFowler.com。
安装
trompette/feature-toggles 库在 Packagist 上分发。
可以使用以下命令将其添加为项目依赖项:
composer require trompette/feature-toggles
独立使用
在处理页面的新版本时,逐步部署新版本可以为团队带来很多信心。
但这也会带来更多工作,因为团队需要
- 保留实现当前版本的代码,
- 添加实现新版本的代码,
- 并一致地为一些用户启用新版本。
使用 trompette/feature-toggles 库,启用新版本是通过询问 切换路由器 当前用户是否有该功能来完成的
if ($toggleRouter->hasFeature($currentUser, 'new_page_version')) { $templating->render('new_page.tpl', $newParameters); } else { $templating->render('page.tpl', $parameters); }
功能注册表
在开始使用 切换路由器 之前,必须注册 new_page_version 功能。
use Trompette\FeatureToggles\FeatureDefinition; use Trompette\FeatureToggles\FeatureRegistry; $featureRegistry = new FeatureRegistry(); $featureRegistry->register(new FeatureDefinition( $name = 'new_page_version', $description = 'awesome new version of a page', $strategy = 'whitelist' ));
切换策略
在定义一个功能时,必须引用一个 切换策略 来指定决定目标是否有功能的算法。
已实现策略包括
- 功能对所有目标启用或对所有目标禁用,请参阅
OnOff类, - 功能仅对白名单目标启用,请参阅
Whitelist类, - 功能对全部目标的百分比启用,请参阅
Percentage类。
策略可以与布尔运算符组合,例如: onoff and whitelist, onoff or whitelist or percentage 等。
切换路由器
use Doctrine\DBAL\Connection; use Trompette\FeatureToggles\DBAL\WhitelistStrategyConfigurationRepository; use Trompette\FeatureToggles\ToggleRouter; use Trompette\FeatureToggles\WhitelistStrategy\Whitelist; $connection = new Connection(...); $repository = new WhitelistStrategyConfigurationRepository($connection); $whitelist = new Whitelist($repository); $toggleRouter = new ToggleRouter( $featureRegistry, $strategies = ['whitelist' => $whitelist] );
策略作为按名称索引的数组注入:这些是在注册功能时应使用的引用。
功能配置
切换路由器 可以用于为给定的策略配置功能
$toggleRouter->configureFeature('feature', 'onoff', 'on'); $toggleRouter->configureFeature('feature', 'onoff', 'off'); $toggleRouter->configureFeature('feature', 'whitelist', 'allow', 'target'); $toggleRouter->configureFeature('feature', 'whitelist', 'disallow', 'target'); $toggleRouter->configureFeature('feature', 'percentage', 'slide', 25); $toggleRouter->configureFeature('feature', 'percentage', 'slide', 50);
通过调用策略实例上的相关方法来持久化配置更改。
所有 Doctrine DBAL 配置存储库都可以迁移模式,因为它们都实现了 SchemaMigrator 接口
use Doctrine\DBAL\Connection; use Trompette\FeatureToggles\DBAL\WhitelistStrategyConfigurationRepository; $connection = new Connection(...); $repository = new WhitelistStrategyConfigurationRepository($connection); $repository->migrateSchema();
与 Symfony 一起使用
在使用Symfony时,所有之前的代码都是可选的:所有内容都是由 FeatureTogglesBundle 类连接在一起的。
在 config/bundles.php 中注册 bundle 是为了利用Symfony集成所必需的。
return [ // ... Trompette\FeatureToggles\Bundle\FeatureTogglesBundle::class => ['all' => true], ];
Bundle配置
可以根据 config:dump-reference 的描述来配置 bundle。
# Default configuration for extension with alias: "feature_toggles" feature_toggles: doctrine_dbal_connection: doctrine.dbal.default_connection declared_features: # Prototype name: description: ~ # Required strategy: ~ # Required
有关技术细节,请参阅 FeatureTogglesConfiguration 类。
容器服务
只有一个服务被公开声明:具有 Trompette\FeatureToggles\ToggleRouter 或 Trompette\FeatureToggles\ToggleRouterInterface 作为标识符的 toggle路由器。
还定义了一些作为服务使用的有用控制台命令,并带有 console.command 标签。
feature-toggles
feature-toggles:configure-feature Configures a feature
feature-toggles:migrate-dbal-schema Migrates DBAL schema
feature-toggles:show-feature-configuration Shows a feature configuration
有关命令的更多信息可以在它们的使用说明中找到。
有关技术细节,请参阅 FeatureTogglesExtension 类。
许可
trompette/feature-toggles 库是在MIT许可下发布的。
有关更多详细信息,请参阅LICENSE 文件。
致谢
trompette/feature-toggles 库受到了 Food Assembly 开发团队 使用的一种实践和工具的启发。
该团队通过阅读 Etsy 工程博客上的文章 Web Experimentation with New Visitors 发现了这种实践。