krystalcode / toggle
为PHP应用程序提供可扩展的功能切换功能。
Requires
- php: >=7.3.0
- symfony/yaml: ^2.0.0|^3.0.0|^4.0.0|^5.0.0
Requires (Dev)
- phpunit/phpunit: ^7.0.0
This package is auto-updated.
Last update: 2024-09-27 05:54:45 UTC
README
切换
关于
Toggle是一个易于使用且可扩展的库,旨在为PHP应用程序提供功能切换功能。
模型
该库模型基于Toggle,这些是定义用于评估功能是否开启或关闭(启用或禁用)的算法的类。示例可能是一个读取配置文件并根据变量值做出决定的Toggle,一个检查用户是否有订阅计划的Toggle,或者一个从外部API获取信息并根据该信息做出决定的Toggle。
需求
目前依赖于Symfony Yaml组件(https://github.com/symfony/yaml)。
如何使用
提供的Toggle
YAML文件
YAML Toggle(ToggleConfigYaml类)从YAML文件加载配置变量,并根据变量值做出决定。它扩展了ToggleConfig类,该类以静态方式存储配置变量,以便即使在代码的多个位置使用功能切换,也只加载一次。
假设以下配置文件内容
awesomefeature/dev: true
awesomefeature/stage: true
awesomefeature/prod: false
以下代码将在开发环境和测试环境中启用功能,并在生产环境中禁用。
use KrystalCode\Toggle\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\Toggle\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\Toggle\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\Toggle\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)中添加你的配置,作为一个带有索引'toggle'的数组项。使用与YAML相同的示例,你的配置文件内容将是
<?php
// Yii2
return [
'toggle' => [
'awesomefeature/dev' => true,
'awesomefeature/stage' => true,
'awesomefeature/prod' => false,
],
];
// Yii1
return [
'params' => [
'toggle' => [
'awesomefeature/dev' => true,
'awesomefeature/stage' => true,
'awesomefeature/prod' => false,
],
],
];
并且你的应用程序代码将是
use KrystalCode\Toggle\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\Toggle\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\Toggle\ConfigLoaderYaml;
use KrystalCode\Toggle\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\Toggle\ConfigLoaderYaml;
use KrystalCode\Toggle\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\Toggle\ConfigLoaderPhp;
use KrystalCode\Toggle\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\Toggle\ConfigLoaderIni;
use KrystalCode\Toggle\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.
}
如何贡献
请随时提交拉取请求。如果你有新功能或未涵盖的使用案例的想法,请打开一个问题进行讨论。