opensoft/rollout-bundle

A Symfony2 Bundle for opensoft/rollout

Installs: 2 643

Dependents: 1

Stars: 17

Watchers: 3

Forks: 2

Language: PHP

1.0.0 2014-04-08 05:40 UTC

README

A Symfony2 Bundle for opensoft/rollout

Build Status Scrutinizer Code Quality Code Coverage Total Downloads Latest 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

new Opensoft\RolloutBundle\OpensoftRolloutBundle(),

2) Configuration

Add the following to your configuration

opensoft_rollout:
    user_provider_service: acme.user_provider_service
    storage_service: acme.storage_service

3) Implement Interfaces

RolloutUserInterface

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

<?php

use Opensoft/Rollout/RolloutUserInterface;

class User implements RolloutUserInterface
{
    /**
     * @return string
     */
    public function getRolloutIdentifier()
    {
        return $this->email;
    }
}
UserProviderInterface

Expose individual users to the rollout interface by implementing the UserProviderInterface

<?php

use Doctrine\ORM\EntityRepository;
use Opensoft\RolloutBundle\Rollout\UserProviderInterface;

class UserRepository extends EntityRepository implements UserProviderInterface
{
    /**
     * @param  mixed $id
     * @return RolloutUserInterface|null
     */
    public function findByRolloutIdentifier($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

<?php

use Opensoft\RolloutBundle\Rollout\GroupDefinitionInterface;

class AcmeEmployeeGroupDefinition implements GroupDefinitionInterface
{
    /**
     * @return string
     */
    public function getName()
    {
        return 'acme_employee';
    }

    /**
     * @return string
     */
    public function getDescription()
    {
        return 'This group contains acme company employees';
    }

    /**
     * @return \Closure
     */
    public function getCallback()
    {
        return function(RolloutUserInterface $user) {
            // Is this user an employee of acme?
            return strpos($user->getEmail(), 'acme.com') !== false;
        };
    }
}
StorageInterface

Implement a custom storage solution.

<?php

use Opensoft\Rollout\Storage\StorageInterface;

class MyStorage implements StorageInterface
{
    /**
     * @param  string     $key
     * @return mixed|null Null if the value is not found
     */
    public function get($key)
    {
        // implement get
    }

    /**
     * @param string $key
     * @param mixed  $value
     */
    public function set($key, $value)
    {
        // implement set
    }
}

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