pierredup / toggler
Requires
- php: >=7.1.0
- symfony/polyfill-php80: ^1.20
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^0.12.58
- phpstan/phpstan-deprecation-rules: ^0.12.5
- phpstan/phpstan-phpunit: ^0.12.16
- phpstan/phpstan-strict-rules: ^0.12.5
- phpstan/phpstan-symfony: ^0.12.11
- predis/predis: ^1.1
- symfony/console: ^4.4 || ^5.0
- symfony/expression-language: ^4.4 || ^5.0
- symfony/framework-bundle: ^4.1 || ^5.0
- symfony/phpunit-bridge: ^5.2
- symfony/security-core: ^4.4 || ^5.0
- symfony/yaml: ^4.4 || ^5.0
- twig/twig: ^2.7 || ^3.0
Suggests
- symfony/expression-language: To use expressions for conditions
- symfony/framework-bundle: To enable Symfony integration
- symfony/yaml: To pass yml files to the config
- twig/twig: To use the twig extension
This package is not auto-updated.
Last update: 2022-02-01 12:51:21 UTC
README
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,从您项目的根目录运行以下命令
$ composer require predis/predis
RedisStorage
适配器可以接受任何Redis
、RedisArray
、RedisCluster
或Predis\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.yml
或app/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'
注意: features
和storage
选项不能同时使用。您必须使用其中之一。两者中至少定义一个。
注意: 当使用 Symfony 扩展包时,Twig 扩展会自动注册。
注意: 使用 symfony/framework-bundle
包时需要 symfony/security-core
包。
控制台命令
Symfony 扩展包自带了 2 个预注册的控制台命令。
获取功能状态
要查看一个功能是否启用,请运行以下命令
$ php bin/console toggler:get foo
这将输出功能的状态。
您也可以通过传递多个值来获取多个功能的状态
$ php bin/console toggler:get foo bar baz
这将显示功能 foo
、bar
和 baz
是否启用。
使用上下文值获取值
要测试在特定条件下功能是否会启用,您可以使用 -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 文件以获取完整的许可证。