opensoft / rollout-bundle
A Symfony2/3/4 Bundle for opensoft/rollout
Installs: 118 474
Dependents: 0
Suggesters: 0
Security: 0
Stars: 42
Watchers: 4
Forks: 10
Open Issues: 2
Requires
- php: >=5.3
- opensoft/rollout: ~2.1
- symfony/framework-bundle: ~2.1|^3.0|^4.0
Requires (Dev)
- phpunit/phpunit: >=4.0,<6.0
Suggests
- liip/doctrine-cache-bundle: For use with the DoctrineCacheStorageAdapter
README
A Symfony3 Bundle for opensoft/rollout
Obligatory 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 (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 RolloutUserProviderInterface
storage_service
: Defaults toOpensoft\Rollout\Storage\ArrayStorage
, but you can also use the includedOpensoft\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.
<?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.
Note: The rollout StorageInterface
changed in version 2.0.0
.
<?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 } /** * @param string $key * @since 2.0.0 */ public function remove($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 %}