xepozz / feature-flag
Feature-flag management system for Yii 3
Requires
- php: ^8.1
- yiisoft/yii-http: ^1.0.3
Requires (Dev)
- phpunit/phpunit: 10.0.17
- vimeo/psalm: ^5.8
- yiisoft/yii-debug: dev-master
Suggests
- ext-redis: Using Redis as a storage for feature flags
- yiisoft/yii-debug: Debugging of feature flags
This package is auto-updated.
Last update: 2024-10-29 00:31:53 UTC
README
This is a simple library to enable/disable features based on a set of rules.
Installation
composer require xepozz/feature-flag
Configuration
Choose the driver you want to use. Currently, the library supports the following drivers:
- InMemory - stores data in memory. This driver is used by default.
- Redis - stores data in Redis. Uses phpredis extension
InMemory
Configure the driver in the dependency injection container configuration file:
di.php
\Xepozz\FeatureFlag\Driver\InMemoryDriver::class => [ '__construct()' => [ 'flags' => [ 155 => false, 'feature_name' => true, FeaturesEnum::FEATURE_NAME => true, ], ], ],
Or with params.php
:
'xepozz/feature-flag' => [ 'flags' => [ 155 => false, 'feature_name' => true, FeaturesEnum::FEATURE_NAME => true, ], ],
Configuring the driver with
params.php
is only available for theInMemoryDriver
.
Redis
Configure the driver in the dependency injection container configuration file:
di.php
\Xepozz\FeatureFlag\Driver\RedisDriver::class => function () { $redis = new Redis(); $redis->pconnect( host: '127.0.0.1', port: 6379, timeout: 2.5, ); return new \Xepozz\FeatureFlag\Driver\RedisDriver(redis: $redis, hashTableKey: 'ab'); },
The driver uses a hash table functions to store and retrieve data. Read more about the hash table functions here.
Choose a driver
After you have chosen a driver, you need to configure the dependency injection container:
di.php
use Xepozz\FeatureFlag\FlagStorageInterface; use \Xepozz\FeatureFlag\Driver\RedisDriver; return [ // ... FlagStorageInterface::class => RedisDriver::class, // ... ]
Usage
Pull \Xepozz\FeatureFlag\FlagStorageInterface
from the dependency injection container and use it:
isActive(string|int|BackedEnum $flag): bool
use Xepozz\FeatureFlag\FlagStorageInterface; class Controller { public function index(FlagStorageInterface $flagStorage) { if ($flagStorage->isActive('feature_name')) { // feature is enabled } else { // feature is disabled } } }
setFlag(string|int|BackedEnum $flag, bool $active): void
Be careful, in case of using not the
InMemoryDriver
, the flag will be stored permanently.
In case of using the
InMemoryDriver
, the flag will be stored only for the current request. So you can switch the flag depending on the conditions in your code. For instance, you can enable the feature only for trusted IP addresses.
use Xepozz\FeatureFlag\FlagStorageInterface; class Controller { public function index(FlagStorageInterface $flagStorage) { if ($condition) { $flagStorage->setFlag('feature_name', true); } } }
getAll(): array
Returns all flags as an associative array array<string, bool>
.
The only InMemoryDriver
supports returning BackendEnum
as a key, because it does not need to serialize the key.
The key is the flag name, the value is the flag state.
use Xepozz\FeatureFlag\FlagStorageInterface; class Controller { public function index(FlagStorageInterface $flagStorage) { $flags = $flagStorage->getAll(); // ... } }
Testing
Redis
Redis driver requires phpredis extension and a running Redis server.
You can use the following command to start a Redis server in a Docker container:
docker run --rm -p 6379:6379 redis
Or use docker-compose:
docker-compose up -d
Run tests:
composer test
Or
./vendor/bin/phpunit
Looking for more modules?
- Unique ID - Allows you to track the unique user in the application.
- Request ID - A simple library to generate both unique request and response IDs for tracing purposes.
- AB - A simple library to enable A/B testing based on a set of rules.
- Shortcut - Sets of helper functions for rapid development of Yii 3 applications.