Skip to content

Repository files navigation

OpensoftRolloutBundle

A Symfony3 Bundle for opensoft/rollout

Build StatusScrutinizer Code QualityCode CoverageTotal DownloadsLatest Stable Version

Obligatory Screenshot

Screenshot

Installation

1) Install via composer

Add the bundle via composer

composer require opensoft/rollout-bundle

And activate it inside your app\AppKernel.php

newOpensoft\RolloutBundle\OpensoftRolloutBundle(),

2) Configuration

Add the following to your configuration (supports auto-wiring)

opensoft_rollout:
user_provider_service: [YOUR USER PROVIDER SERVICE]storage_service: [YOUR STORAGE SERVICE FOR ROLLOUT]
  • user_provider_service: Add the service id (generally the FQDN with auto-wiring) of the UserProvider to which you added the Rollout UserProviderInterface
  • storage_service: Defaults to Opensoft\Rollout\Storage\ArrayStorage, but you can also use the included Opensoft\RolloutBundle\Storage\Doctrine\DoctrineORMStorage or create your own (see below for implementation)

3) Implement Interfaces

RolloutUserInterface

Any rollout user must implement the RolloutUserInterface. Often, this will be your main user object in the application.

<?phpuse Opensoft/Rollout/RolloutUserInterface;
class User implements RolloutUserInterface
{
/** * @return string */publicfunctiongetRolloutIdentifier()
{
return$this->email;
}
}

UserProviderInterface

Expose individual users to the rollout interface by implementing the UserProviderInterface

<?phpuseDoctrine\ORM\EntityRepository;
useOpensoft\RolloutBundle\Rollout\UserProviderInterface;
class UserRepository extends EntityRepository implements UserProviderInterface
{
/** * @param mixed $id * @return RolloutUserInterface|null */publicfunctionfindByRolloutIdentifier($id)
{
return$this->findOneBy(array('email' => $id));
}
}

GroupDefinitionInterface

Provide different groups of users to your rollout.

Tag all of your group definitions with the DIC tag rollout.group to expose them to the rollout interface

<?phpuseOpensoft\RolloutBundle\Rollout\GroupDefinitionInterface;
class AcmeEmployeeGroupDefinition implements GroupDefinitionInterface
{
/** * @return string */publicfunctiongetName()
{
return'acme_employee';
}
/** * @return string */publicfunctiongetDescription()
{
return'This group contains acme company employees';
}
/** * @return \Closure */publicfunctiongetCallback()
{
returnfunction(RolloutUserInterface$user) {
// Is this user an employee of acme?returnstrpos($user->getEmail(), 'acme.com') !== false;
};
}
}

StorageInterface

Implement a custom storage solution.

Note: The rollout StorageInterfacechanged in version 2.0.0.

<?phpuseOpensoft\Rollout\Storage\StorageInterface;
class MyStorage implements StorageInterface
{
/** * @param string $key * @return mixed|null Null if the value is not found */publicfunctionget($key)
{
// implement get
}
/** * @param string $key * @param mixed $value */publicfunctionset($key, $value)
{
// implement set
}
/** * @param string $key * @since 2.0.0 */publicfunctionremove($key)
{
// implement remove
}
}

4) Activate Routing

Add the following to your app/Resources/config/routing.yml file:

opensoft_rollout:
resource: "@OpensoftRolloutBundle/Resources/config/routing.yml"
prefix: /admin/rollout

Usage

Check if a feature is enabled in a controller

if ($this->get('rollout')->isActive('chat', $this->getUser())) {
// do some chat related feature work
}

Twig example:

{% if rollout_is_active('chat', app.user) %}
<!-- show a chat interface -->
{% endif %}

Further Reading

About

A Symfony2 Bundle for opensoft/rollout

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages