krystalcode / feature-toggle
为PHP应用程序提供可扩展的功能切换功能。
Requires
- php: >=5.3.3
- symfony/yaml: ^2.5.0
Requires (Dev)
- phpunit/phpunit: ^4.3.0
This package is auto-updated.
Last update: 2024-08-29 04:08:59 UTC
README
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请求。如果你有关于新功能或未涵盖的使用案例的想法,请提出问题以进行讨论。