This is a simple library to enable/disable features based on a set of rules.
composer require xepozz/feature-flag
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
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
.
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.
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,
// ...
]
Pull \Xepozz\FeatureFlag\FlagStorageInterface
from the dependency injection container and use it:
use Xepozz\FeatureFlag\FlagStorageInterface;
class Controller
{
public function index(FlagStorageInterface $flagStorage)
{
if ($flagStorage->isActive('feature_name')) {
// feature is enabled
} else {
// feature is disabled
}
}
}
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);
}
}
}
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();
// ...
}
}
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
composer test
Or
./vendor/bin/phpunit
- 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.