opensoft/rollout-bundle

opensoft/rollout 的 Symfony2/3/4 Bundle

2.2.0 2019-05-31 16:23 UTC

This package is auto-updated.

Last update: 2024-08-29 03:52:47 UTC


README

一个为 opensoft/rollout 定制的 Symfony3 Bundle

Build Status Scrutinizer Code Quality Code Coverage Total Downloads Latest Stable Version

必选截图

Screenshot

安装

1) 通过 composer 安装

使用 composer 添加 bundle

composer require opensoft/rollout-bundle

并在你的 app/AppKernel.php 中激活它

new Opensoft\RolloutBundle\OpensoftRolloutBundle(),

2) 配置

将以下内容添加到你的配置文件中(支持自动装配)

opensoft_rollout:
    user_provider_service: [YOUR USER PROVIDER SERVICE]
    storage_service: [YOUR STORAGE SERVICE FOR ROLLOUT]
  • user_provider_service: 添加 UserProvider 的服务 id(通常是带有自动装配的 FQDN)
  • storage_service: 默认为 Opensoft\Rollout\Storage\ArrayStorage,但你也可以使用包含的 Opensoft\RolloutBundle\Storage\Doctrine\DoctrineORMStorage 或创建自己的(见下文实现)

3) 实现接口

RolloutUserInterface

任何滚动用户 必须 实现 RolloutUserInterface。这通常是你的应用程序中的主要用户对象。

<?php

use Opensoft/Rollout/RolloutUserInterface;

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

UserProviderInterface

通过实现 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

为你的滚动提供不同的用户组。

使用 DIC 标签 rollout.group 标记所有你的组定义,以便将它们暴露给滚动接口

<?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

实现自定义存储解决方案。

注意: rollout 的 StorageInterface 在版本 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) 激活路由

将以下内容添加到你的 app/Resources/config/routing.yml 文件中

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

使用方法

在控制器中检查功能是否启用

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

Twig 示例

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

进一步阅读