krystalcode/feature-toggle

为PHP应用程序提供可扩展的功能切换功能。

0.2.2 2015-10-30 10:01 UTC

This package is auto-updated.

Last update: 2024-08-29 04:08:59 UTC


README

SensioLabsInsight

Scrutinizer Code Quality Build Status Code Coverage Dependency Status Latest Stable Version License

FeatureToggle

关于

FeatureToggle是一个易于使用、可扩展的库,旨在为PHP应用程序提供功能切换功能。

模型

库模型基于Toggles,这些是定义用于评估功能是否开启或关闭(启用或禁用)的算法的类。例如,可能有读取配置文件并根据变量值做出决定的Toggle,或者检查用户是否有订阅计划的Toggle,或者从外部API获取信息并根据该信息做出决定的Toggle。

要求

目前依赖于Symfony Yaml组件(https://github.com/symfony/yaml)。

如何使用

提供的Toggles

YAML文件

YAML Toggle(ToggleConfigYaml类)从YAML文件加载配置变量并根据变量值做出决定。它扩展了ToggleConfig类,该类静态存储配置变量,即使代码中多处使用功能切换,也只会加载一次。

假设以下配置文件内容

awesomefeature/dev: true
awesomefeature/stage: true
awesomefeature/prod: false

以下代码将在开发环境和预发布环境中启用功能,并在生产环境中禁用它。

use KrystalCode\FeatureToggle\Toggle;

if (Toggle::yaml('absolute/path/to/config.yml', 'awesomefeature/'.$yourCurrentEnvironment)) {
    // Code to be executed when the feature is enabled.
}

其中变量$yourCurrentEnvironment应具有"dev"、"stage"或"prod"的值。在运行时,代码将在开发环境和预发布环境中执行,但不在生产环境中执行。

配置变量也可以有除了true或false之外的其他值。假设你只想在蓝色主题使用时启用功能

theme: blue

以下代码将在变量"theme"的值为"blue"时启用功能。

use KrystalCode\FeatureToggle\Toggle;

if (Toggle::yaml('absolute/path/to/config.yml', 'theme', 'blue')) {
    // Code to be executed when the feature is enabled.
}

PHP文件

你可以从PHP配置文件中加载变量。使用与YAML相同的示例,你的配置文件内容将是

<?php
return array(
    'awesomefeature/dev' => true,
    'awesomefeature/stage' => true,
    'awesomefeature/prod' => false,
);

并且你的应用程序代码将是

use KrystalCode\FeatureToggle\Toggle;

if (Toggle::php('absolute/path/to/config.php', 'awesomefeature/'.$yourCurrentEnvironment)) {
    // Code to be executed when the feature is enabled.
}

INI文件

你可以从INI配置文件(.ini,请参阅https://php.ac.cn/manual/en/function.parse-ini-file.php)中加载变量。使用与YAML相同的示例,你的配置文件内容将是

awesomefeature/dev = true
awesomefeature/stage = true
awesomefeature/prod = false

并且你的应用程序代码将是

use KrystalCode\FeatureToggle\Toggle;

if (Toggle::ini('absolute/path/to/config.ini', 'awesomefeature/'.$yourCurrentEnvironment)) {
    // Code to be executed when the feature is enabled.
}

集成

Yii框架

你需要在params.php文件(Yii2)或main.php文件(Yii1)中将配置添加为一个具有索引'featureToggle'的数组项。使用与YAML相同的示例,你的配置文件内容将是

<?php
// Yii2
return [
    'featureToggle' => [
        'awesomefeature/dev' => true,
        'awesomefeature/stage' => true,
        'awesomefeature/prod' => false,
    ],
];

// Yii1
return [
    'params' => [
        'featureToggle' => [
            'awesomefeature/dev' => true,
            'awesomefeature/stage' => true,
            'awesomefeature/prod' => false,
        ],
    ],
];

并且你的应用程序代码将是

use KrystalCode\FeatureToggle\Toggle;

// Yii2
if (Toggle::yii2('awesomefeature/'.$yourCurrentEnvironment)) {
    // Code to be executed when the feature is enabled.
}

// Yii1
if (Toggle::yii1('awesomefeature/'.$yourCurrentEnvironment)) {
    // Code to be executed when the feature is enabled.
}

如何扩展

假设你只想为你的网站上的高级用户提供功能。你可以编写以下自定义Toggle

use KrystalCode\FeatureToggle\ToggleInterface;

class TogglePremiumUser implements ToggleInterface
{
    private $user;

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

    public function on()
    {
        // You can also add your logic here if preferred.
        return $this->user->isPremium();
    }
}

完整语法

上面的示例使用了由辅助类提供的简单语法。YAML示例的完整语法如下

use KrystalCode\FeatureToggle\ConfigLoaderYaml;
use KrystalCode\FeatureToggle\ToggleConfig;
use Symfony\Component\Yaml\Parser;

$loader = new ConfigLoaderYaml(new Parser(), '/absolute/path/to/config.yml');
$toggle = new ToggleConfig($loader, 'awesomefeature/'.$yourCurrentEnvironment);
if ($toggle->on()) {
    // Code to be executed when the feature is enabled.
}

use KrystalCode\FeatureToggle\ConfigLoaderYaml;
use KrystalCode\FeatureToggle\ToggleConfig;
use Symfony\Component\Yaml\Parser;

$loader = new ConfigLoaderYaml(new Parser(), '/absolute/path/to/config.yml');
$toggle = new ToggleConfig($loader, 'theme', 'blue');
if ($toggle->on()) {
    // Code to be executed when the feature is enabled.
}

对于PHP

use KrystalCode\FeatureToggle\ConfigLoaderPhp;
use KrystalCode\FeatureToggle\ToggleConfig;

$loader = new ConfigLoaderPhp('/absolute/path/to/config.php');
$toggle = new ToggleConfig($loader, 'awesomefeature/'.$yourCurrentEnvironment);
if ($toggle->on()) {
    // Code to be executed when the feature is enabled.
}

和对于INI

use KrystalCode\FeatureToggle\ConfigLoaderIni;
use KrystalCode\FeatureToggle\ToggleConfig;

$loader = new ConfigLoaderIni('/absolute/path/to/config.ini');
$toggle = new ToggleConfig($loader, 'theme', 'blue');
if ($toggle->on()) {
    // Code to be executed when the feature is enabled.
}

如何贡献

请随意提交pull请求。如果你有关于新功能或未涵盖的使用案例的想法,请提出问题以进行讨论。