cleancode / feature-toggle-bundle
特性开关负责根据配置切换服务注入。允许在不更改代码的情况下修改系统行为。
1.0.0
2017-02-26 18:32 UTC
Requires
- php: >=7.0.0
- symfony/framework-bundle: ~3.0
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"
时,将使用包含上述标签的服务