solidworx / toggler
功能开关库
Requires
- php: >=7.3
- symfony/polyfill-php80: ^1.20
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.5
- predis/predis: ^1.1 || ^2.0
- symfony/console: ^4.4 || ^5.0
- symfony/expression-language: ^4.4 || ^5.0
- symfony/framework-bundle: ^4.1 || ^5.0
- 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 auto-updated.
Last update: 2024-09-04 15:50:17 UTC
README
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
$ 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 包含一个 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'
注意: 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
功能。
列出所有可用功能
您可以使用toggler:list
命令列出所有可用功能。
$ php bin/console toggler:list
这将显示所有可用功能和它们的状态。
测试
要运行单元测试,请执行以下命令
$ vendor/bin/phpunit
贡献
许可协议
切换器是开源软件,遵循MIT许可证。
请参阅LICENSE文件以获取完整的许可证信息。