Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bestit/flagception-sdk
A simple and powerful feature toggle library for php.
https://github.com/bestit/flagception-sdk
feature feature-flags feature-toggle flags rollout testing toggle
Last synced: 5 days ago
JSON representation
A simple and powerful feature toggle library for php.
- Host: GitHub
- URL: https://github.com/bestit/flagception-sdk
- Owner: bestit
- License: mit
- Created: 2017-12-30T15:56:47.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2023-02-14T18:33:44.000Z (over 1 year ago)
- Last Synced: 2024-03-15T10:11:18.426Z (8 months ago)
- Topics: feature, feature-flags, feature-toggle, flags, rollout, testing, toggle
- Language: PHP
- Homepage:
- Size: 61.5 KB
- Stars: 68
- Watchers: 7
- Forks: 19
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Flagception
Flagception is a simple and powerful feature toggle library.
Only a few lines of configuration necessary - and still very flexible and expandable.[![Latest Stable Version](https://poser.pugx.org/flagception/flagception/v/stable)](https://packagist.org/packages/flagception/flagception)
[![Coverage Status](https://coveralls.io/repos/github/bestit/flagception-sdk/badge.svg?branch=master)](https://coveralls.io/github/bestit/flagception-sdk?branch=master)
[![Build Status](https://travis-ci.org/bestit/flagception-sdk.svg?branch=master)](https://travis-ci.org/bestit/flagception-sdk)
[![Total Downloads](https://poser.pugx.org/flagception/flagception/downloads)](https://packagist.org/packages/flagception/flagception)
[![License](https://poser.pugx.org/flagception/flagception/license)](https://packagist.org/packages/flagception/flagception)[![SensioLabsInsight](https://insight.sensiolabs.com/projects/4423478b-f6db-4f77-bb36-0782bcdf82c0/small.png)](https://insight.sensiolabs.com/projects/4423478b-f6db-4f77-bb36-0782bcdf82c0)
Download the library
---------------------------Open a command console, enter your project directory and execute the
following command to download the latest stable version of this library:```console
$ composer require flagception/flagception
```Quick example
---------------------------
Just create a `FeatureManager` instance and pass your activator to start with feature toggling.```php
// MyClass.php
class MyClass
{
public function doSomething()
{
// The activator decide if the feature is active or not
// You can use your own activator if you implement the interface
$activator = new ArrayActivator();$manager = new FeatureManager($activator);
if ($manager->isActive('your_feature_name')) {
// do something
}
}
}
```The activator is the most important class and decide if the given feature is active or not. The `ArrayActivator` needs
an array with active feature names as constructor argument. If the requested feature is in array, it will return true
otherwise false. Example:```php
// MyClass.php
class MyClass
{
public function doSomething()
{
$activator = new ArrayActivator([
'feature_abc',
'feature_def',
'feature_ghi'
]);$manager = new FeatureManager($activator);
// Will return true
if ($manager->isActive('feature_def')) {
// do something
}// Will return false
if ($manager->isActive('feature_wxy')) {
// do something
}
}
}
```This library ships an [ArrayActivator](docs/activator/array.md), a [ConstraintActivator](docs/activator/constraint.md),
a [EnvironmentActivator](docs/activator/environment.md), [CookieActivator](docs/activator/cookie.md)
and a [ChainActivator](docs/activator/chain.md).In most cases you will create your own activator (eg. for doctrine). Just implement the `FeatureActivatorInterface`.
You can use a [CacheActivator](docs/activator/cache.md) if you want to cache the result from some time intensive activators.
Advanced example
---------------------------
Sometimes your activator needs more context for deciding if a feature is active or not. You can optionally add a context
object as second argument to the manager and check the context data in your activator.Example:
```php
// MyClass.php
class MyClass
{
public function doSomething(User $user)
{
$activator = new YourCustomDoctrineActivator();$manager = new FeatureManager($activator);
$context = new Context();
$context->add('user_id', $user->getId());
// Check the feature with context
if ($manager->isActive('feature_def', $context)) {
// do something
}
// Check the feature without context (result may differ from above)
if ($manager->isActive('feature_def')) {
// do something
}
}
}// YourCustomDoctrineActivator.php
class YourCustomDoctrineActivator implements FeatureActivatorInterface
{
public function isActive($name, Context $context)
{
return $context->get('user_id') === 12;
}
}
```You can also add the context data globally instead of adding the context to each feature request. Just pass a class
which implement the `ContextDecoratorInterface` as second argument for the feature manager constructor:```php
// MyClass.php
class MyClass
{
public function doSomething(User $user)
{
$activator = new YourCustomDoctrineActivator();
$decorator = new ArrayDecorator([
'user_id' => $user->getId()
]);$manager = new FeatureManager($activator, $decorator);
// Check the feature with the global defined context
if ($manager->isActive('feature_def')) {
// do something
}
}
}//YourCustomDoctrineActivator.php
class YourCustomDoctrineActivator implements FeatureActivatorInterface
{
public function isActive($name, Context $context)
{
return $context->get('user_id') === 12;
}
}
```You can also mix both variants:
```php
// MyClass.php
class MyClass
{
public function doSomething(User $user)
{
$activator = new YourCustomDoctrineActivator();
$decorator = new ArrayDecorator([
'user_id' => $user->getId()
]);$manager = new FeatureManager($activator, $decorator);
$context = new Context();
$context->add('user_name', $user->getUsername());// Check the feature with the global defined context
if ($manager->isActive('feature_def', $context)) {
// do something
}
}
}
```This library ships an [ArrayDecorator](docs/decorator/array.md) and a [ChainDecorator](docs/decorator/chain.md).