pierredup/toggler

此软件包已被废弃,不再维护。作者建议使用 solidworx/toggler 软件包。

特性开关库

2.0.0-alpha4 2020-12-10 14:52 UTC

README

Test Suite codecov

Toggler 是一个用于 PHP 的特性开关库。它允许您根据开关切换来启用或禁用功能。这在持续部署环境中非常有用,您可以在功能完成前部署尚未准备就绪的功能,并在功能完成时启用它们。

目录

要求

Toggler 需要 PHP 7.1+ 和 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));

YAML

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

要从项目根目录安装和使用 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支持持久化配置值,如果存储适配器实现了SolidWorx\Toggler\Storage\PersistentStorageInterface

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

  • YamlFileStorage
  • RedisStorage

要更新一个功能,请使用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 Bundle](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,请注册bundle

// AppKernel.php

$bundles = array(
   ...
   new SolidWorx\Toggler\Symfony\TogglerBundle(),
   ...
);

然后,在您的app/config/config.ymlapp/config/config_dev.yml中,您可以使用以下配置启用功能

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 功能。

测试

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

$ vendor/bin/phpunit

贡献

请参阅 CONTRIBUTING

许可证

Toggler 是开源软件,许可协议为 MIT 许可协议

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