长号/功能开关

功能开关基础设施,实现持续部署

5.1.0 2024-03-25 20:24 UTC

This package is auto-updated.

Last update: 2024-09-04 19:38:34 UTC


README

License Stable Version Automated Tests Static Analysis

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 whitelistonoff 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\ToggleRouterTrompette\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 发现了这种实践。