solidworx/toggler

功能开关库

2.0.0-alpha6 2024-06-04 15:13 UTC

README

Test Suite codecov

Toggler 是一个针对 PHP 的功能开关库。它允许您根据开关来启用或禁用功能。这在持续部署环境中非常有用,您可以部署尚未准备好的功能,并将它们禁用,然后在功能完成时才启用它们。

目录

需求

Toggler 需要 PHP 7.3+ 和 Symfony 4.0+。

安装

Composer

$ composer require solidworx/toggler:^2.0

使用

快速示例

<?php

use SolidWorx\Toggler\Toggle;
use SolidWorx\Toggler\Storage\ArrayStorage;

$features = [
    'foo' => true,
    'bar' => false
];

$toggle = new Toggle(new ArrayStorage($features));

您可以使用 isActive 调用来检查功能是否激活

<?php

$toggle->isActive('foo'); // true
$toggle->isActive('bar'); // false

StorageFactory

Toggler 提供许多存储适配器来存储配置。最基本的是 ArrayStorage 类,它接受一个功能数组。

StorageFactory 类作为工厂来创建配置。您可以传递任何值,它将确定使用哪个存储适配器。要获取配置的实例,您可以使用静态的 factory 方法

<?php

use SolidWorx\Toggler\Storage\StorageFactory;

$features = [
    'foo' => true,
    'bar' => false
];

$config = StorageFactory::factory($features); // $config will be an instance of ArrayStorage

// Using YAML
$config = StorageFactory::factory('/path/to/config.yml'); // $config will be an instance of YamlFileStorage

每个功能标志都必须是一个真值才能启用。

以下真值被接受

  • (布尔) true
  • (整数) 1
  • '1'
  • 'on'
  • 'yes'
  • 'y'

使用回调

您还可以使用闭包或回调来检索值

<?php

$features = [
    'foo' => function () {
        return true;
    },
    'bar' => [$myObject, 'checkBar']
];

存储适配器

Toggler 支持各种存储适配器来存储配置。

数组

最基本配置是使用带有 ArrayStorage 适配器的数组。

<?php

use SolidWorx\Toggler\Storage\StorageFactory;
use SolidWorx\Toggler\Storage\ArrayStorage;
use SolidWorx\Toggler\Toggle;

$features = [
    'foo' => true,
    'bar' => false
];

$toggle = new Toggle(new ArrayStorage($features));

// Or using the StorageFactory factory
$toggle = new Toggle(StorageFactory::factory($features));

ENV

从环境变量中读取值。

<?php

use SolidWorx\Toggler\Storage\EnvStorage;
use SolidWorx\Toggler\Toggle;

$toggle = new Toggle(new EnvStorage());

$toggle->isActive('MY_AWESOME_FEATURE'); // true if the environment variable MY_AWESOME_FEATURE is set to a truthy value

YAML

为了使用 yml 文件进行配置,您需要包含 Symfony Yaml 组件

要安装和使用 Yaml 组件,从项目根目录运行以下命令

$ composer require symfony/yaml

然后您可以使用 yaml 文件定义配置

// config.yml
foo: true
bar: false

将 yml 文件的路径传递给配置

<?php

use SolidWorx\Toggler\Storage\StorageFactory;
use SolidWorx\Toggler\Storage\YamlFileStorage;
use SolidWorx\Toggler\Toggle;

$toggle = new Toggle(new YamlFileStorage('/path/to/config.yml'));

// Or using the StorageFactory factory
$toggle = new Toggle(StorageFactory::factory('/path/to/config.yml'));

PHP 文件

您可以将配置存储在单独的 PHP 文件中。此文件需要返回一个配置数组。默认情况下,PHP 文件始终使用 ArrayStorage 适配器。

<?php

// config.php
return[
    'foo' => true,
    'bar' => false,
];

将 PHP 文件的路径传递给配置

<?php

use SolidWorx\Toggler\Storage\StorageFactory;
use SolidWorx\Toggler\Toggle;

$toggle = new Toggle(StorageFactory::factory('/path/to/config.php'));

Redis

您可以使用 Redis 来存储配置。

您需要安装 Predis 库或 Redis PHP 扩展。

从项目根目录运行以下命令来安装 Predis

$ composer require predis/predis

RedisStorage 适配器可以接受任何 RedisRedisArrayRedisClusterPredis\Client 类型的实例。

<?php

use SolidWorx\Toggler\Storage\RedisStorage;
use SolidWorx\Toggler\Toggle;

$redis = new \Redis();
$toggle = new Toggle(new RedisStorage($redis));

数据库

您可以使用数据库来存储配置。

Toggler 包含一个 PDOStorage 适配器,它可以与支持 PDO 的任何数据库一起使用。

<?php

use SolidWorx\Toggler\Storage\PDOStorage;
use SolidWorx\Toggler\Toggle;

$toggle = new Toggle(new PDOStorage('mysql:host=localhost', 'username', 'password', 'my_feature_table_name'));

持久存储

如果存储适配器实现了 SolidWorx\Toggler\Storage\PersistenStorageInterface,则 Toggler 支持持久化配置值。

以下存储适配器目前支持持久化配置值

  • YamlFileStorage
  • RedisStorage
  • PDOStorage

要更新功能,请使用 set 方法

<?php

$toggle->set('foo', true); // This will enable the foo feature
$toggle->set('bar', false); // This will disable the bar feature

根据上下文切换功能

在特定条件下启用功能(例如,仅对某个组内的用户启用,或仅对10%的访客启用等)

配置中的每个功能都可以接受一个回调,您可以根据自己的逻辑返回一个真值。

<?php

$features = [
    'foo' => function (User $user) {
        return in_array('admin', $user->getGroups()); // Only enable features for users in the 'admin' group
    },
    'bar' => function () {
        return  (crc32($_SERVER['REMOTE_ADDR']) % 100) < 25; // Only enable this features for about 25% of visitors
    },
    'baz' => function (Request $request) {
        return false !== strpos($request->headers->get('referer'), 'facebook.com'); // Only enable this features for users that come from Facebook
    }
];

接受任何参数的回调应该使用上下文来调用。

<?php

$user = User::find(); // Get the current logged-in user

if ($toggle->isActive('foo', [$user])) {
    
}

if ($toggle->isActive('bar', [$request])) {
    
}

使用 Symfony 表达式语言

您可以使用Symfony表达式语言组件为您的功能创建表达式。

要安装和使用表达式语言组件,请在项目根目录下运行以下命令

$ composer require symfony/expression-language

然后您可以创建一个用于您功能的表达式

<?php

use Symfony\Component\ExpressionLanguage\Expression;

$feaures = [
    'foo' => new Expression('valueOne > 10 and valueTwo < 10')
];

在检查功能时,您需要传递用于您的表达式的上下文

<?php

if ($toggle->isActive('foo', ['valueOne' => 25, 'valueTwo' => 5])) { // Will return true
    
}

Twig集成

Toggler附带一个可选的Twig扩展,允许您从Twig模板中切换元素。

要使用此扩展,将其与Twig注册

<?php

use SolidWorx\Toggler\Twig\Extension\ToggleExtension;

$twig = new \Twig_Environment($loader);
$twig->addExtension(new ToggleExtension($toggle));

或者如果您使用symfony,将其注册为服务。

注意:当使用[Symfony包](Symfony集成)时,twig扩展将自动注册。

然后您可以在twig模板中使用toggle标签

{% toggle 'foo' %}
    Some content that will only display if foo is enabled
{% endtoggle %}

要添加一个可选内容,如果功能不可用,请使用else标签

{% toggle 'foo' %}
    Some content that will only display if foo is enabled
{% else %}
    Some content that will only display if foo is not enabled
{% endtoggle %}

要使用标签的上下文值,可以使用with关键字传递它

{% toggle 'foo' with {"valueOne" : 12} %}
    Some content that will only display if foo is enabled based on the context provided
{% endtoggle %}

您还可以使用toggle()函数进行条件判断

{{ toggle('foo') ? 'Foo is enabled' : 'Foo is NOT enabled' }}

Symfony集成

Toggler与Symfony框架集成。

要启用symfony中的toggler,注册此包

// config/bundles.php

return array(
   ...
   SolidWorx\Toggler\Symfony\TogglerBundle::class => ['all' => true],
   ...
);

然后创建一个config/packages/toggler.yaml配置文件,以启用功能

toggler:
    config:
        features:
            foo: true
            bar: false
            
            # Callables is also supported
            baz: '@my.service.class' # Class must be callable (I.E implement the __invoke() method)
            foobar: ['@my.service.class', 'foobar'] # Will call the `foobar` method on the service class
            baz: ['My\Awesome\Feature\Class', 'checkFeature'] # Will call the static method `checkFeature` on the `My\Awesome\Feature\Class` class
            
            # The last two lines can be written as the following:
            foobar: '@my.service.class::foobar'
            baz: 'My\Awesome\Feature\Class::checkFeature'

如果您想为功能配置使用表达式,可以使用@=语法

toggler:
    config:
        features:
            foo: '@=myValue > 10'

如果您想使用存储类,可以使用storage配置参数来定义存储的服务

services:
    my.toggler.storage:
        class: SolidWorx\Toggler\Storage\RedisStorage
        arguments: ['@redis']
        
toggler:
    config:
        storage: '@my.toggler.storage'

注意: featuresstorage选项不能同时使用。您必须使用其中一个。至少必须定义其中一个。

注意:当使用Symfony包时,twig扩展将自动注册。

注意:需要symfony/framework-bundle包与symfony/security-core一起使用。

控制台命令

Symfony包附带2个预注册的控制台命令。

获取功能的状态

要查看功能是否启用,请运行以下命令

$ php bin/console toggler:get foo

这将输出功能的状态。

您还可以通过传递多个值来获取多个功能的状态

$ php bin/console toggler:get foo bar baz

这将显示功能foobarbaz是否启用。

使用上下文值获取值

要测试在特定条件下功能是否启用,您可以使用-c--context标志将上下文值传递给命令。可以提供多个上下文值。

注意:上下文值只能是字符串。不支持对象。

$ php bin/console toggler:get foo -c myValue=10 -c anotherValue=25

设置功能值

您可以使用toggler:set命令启用或禁用功能。

注意:如果您使用的是持久化存储,则可以更改功能的状态。

$ php bin/console toggler:set foo true

这将启用foo功能。

列出所有可用功能

您可以使用toggler:list命令列出所有可用功能。

$ php bin/console toggler:list

这将显示所有可用功能和它们的状态。

测试

要运行单元测试,请执行以下命令

$ vendor/bin/phpunit

贡献

CONTRIBUTING

许可协议

切换器是开源软件,遵循MIT许可证

请参阅LICENSE文件以获取完整的许可证信息。