cleancode/feature-toggle-bundle

特性开关负责根据配置切换服务注入。允许在不更改代码的情况下修改系统行为。

1.0.0 2017-02-26 18:32 UTC

This package is auto-updated.

Last update: 2024-08-29 04:19:59 UTC


README

描述

特性开关负责根据配置切换服务注入
允许在不更改代码的情况下修改系统行为。

示例

示例使用JMSDiExtraBundle,但您可以使用services.yml轻松配置它

假设我们想要存储图片。在开发机器上,我们希望在文件系统中存储它们,但在任何其他地方我们希望存储在亚马逊上。

interface PictureStorage
{
    /**
     * @param PictureWithContent $picture
     * @return void
     */
    public function store(string $pictureName, string $content);
}


/**
* @DI\Service("amazon_picture_storage")
* @DI\Tag(name="toggle", attributes={"for"="picture_storage", "on"="amazon_storage", "when"="enabled"})
*/
class AmazonPictureStorage
{
    public function store(string $pictureName, string $content)
    {
        // send it amazon
    }
}

/**
* @DI\Service("file_system_picture_storage")
* @DI\Tag(name="toggle", attributes={"for"="picture_storage", "on"="amazon_storage", "when"="disabled"})
*/
class FileSystemPictureStorage
{
    public function store(string $pictureName, string $content)
    {
        // save it locally
    }
}

现在当我们的服务被定义后。我们必须设置默认服务,如果所有when指定都失败,它将始终被选中。我们通过服务别名来做这件事。对我们来说,默认是amazon_picture_storage

services.yml
    picture_storage:
       alias: amazon_picture_storage

我们还应该有一个参数,用来决定选择哪个实现。
在我们的例子中是amazon_storage

parameters.yml
    amazon_storage: "disabled"

现在我们可以使用我们的存储了。

class AppController
{
    private $pictureStorage;

    /**
     * @DI\InjectParams({
     *      "pictureStorage" = @DI\Inject("picture_storage")
     * })
    */
    public function __construct(PictureStorage $pictureStorage)
    {
        $this->pictureStorage = $pictureStorage;       
    }

    public function createPersonWithImage(string $pictureName, string $content)
    {
        $this->pictureStorage->store($pictureName, $content);
    }
}
注解解释

@DI\Tag(name="toggle", attributes={"for"="picture_storage", "on"="amazon_storage", "when"="disabled"})

  • name="toggle" - 标记服务由FeatureToggleBundle使用
  • "for"="picture_storage" - 将被替换的服务别名
  • "on"="amazon_storage" - 用于决定注入哪个参数的参数名
  • "when"="disabled" - 当参数值为特定值时,应选择包含此标签的服务

因此,当amazon_storage参数值为equal to "disabled"时,将使用包含上述标签的服务