vend / pheat
特性管理器
Requires
- php: >=5.5.0
- psr/log: ~1.0.0
Requires (Dev)
- monolog/monolog: ~1.11
- phpunit/phpunit: ~4.3
This package is not auto-updated.
Last update: 2022-02-05 02:39:15 UTC
README
PHP 5.4+ 特性管理器
Pheat 是一个简单的 PHP 5.4+ 特性管理器的实现。它使用的主要抽象有
- 一个
Provider
了解一系列Feature
实例的状态 - 一个
Provider
可以根据Context
变更其特性列表 - 一个
Manager
可以根据一系列Provider
实例及其状态合并,来判断特定特性是激活还是非激活
安装
Pheat 使用 PSR4 进行自动加载。在 Packagist 上可用,名称为 vend/pheat
。
使用方法
检查特性
您将主要使用 Pheat\Manager
实例进行特性管理。最简单的情况下,管理器会告诉您特性应该是激活还是非激活的。
if ($manager->resolve('fancy_graphics')) { // Output the fancy graphics }
状态布尔语义
resolve
方法总是返回布尔值或 null。
- 如果特性应该被视为激活的,则返回
true
- 如果特性应该被视为非激活的,则返回
false
- 如果对特性的状态一无所知,则返回
null
大多数情况下,如果您对特性一无所知,您可能不希望启用它。因此,您可以对 resolve
返回的值进行宽松的“假”检查。
高级状态信息
如果您调用管理器的 resolveFeature
方法,您将收到一个 FeatureInterface
实例(而不是状态值)。如果需要知道特性为什么是激活的,这可能很有用,因为它可以告诉您哪个提供者将其标记为激活。
这也是您实现 变体、比例 或 桶 的地方:更复杂的特性分配方式。FeatureInterface
确保可以更详细地查询特性为什么是激活或非激活的。
配置
管理器
当您创建一个 Manager
时,通常会给它一个 Context
和一个 Providers
列表。
上下文
Context
是特性管理器运行的环境集合。上下文中的信息是管理器用来决定是否启用特性的信息。因此,例如,您可以在上下文中包含您的最终用户的用户名:这样,您就能够为特定用户管理特性(或以百分比跨用户池管理特性)。
将 Context
传递给 Manager
。一旦 Manager
解析了当前功能列表一次(并缓存它),则管理器被锁定,对上下文所做的更改不会影响功能。创建一个新的 Manager
来刷新功能。
您可以使用默认的 Context
实现(这是一个简单的基于数组的属性包),或者您自己的 ContextInterface
实现。
提供者
提供者告诉管理器哪些功能存在,以及它们何时应该启用。提供者必须实现 Pheat\ProviderInterface
。您可以在创建管理器时实例化并提供者,或者在其创建后添加。
$manager = new Pheat\Manager($context, [ new My\Custom\Provider(), new My\Other\Provider() ]);
或者创建后
$manager->addProvider(new My\Custom\Provider())
提供者被保留并按顺序列表处理(因此调用 addProvider
的顺序很重要)。
功能
Feature
对象持有命名功能的状况。它还持有提供者引用,该提供者提供了有关功能的信息。
::resolve()
当两个或多个提供者就同一功能(根据功能名称)提供信息时,它们的状况合并以找到应该“获胜”的提供者(并控制功能是否启用最终值)。这是通过将先前控制的功能传递给要合并的“新”功能的 resolve()
方法来完成的。
resolve()
方法返回现在应被视为控制者的 Feature
实例。这使得它成为实现复杂逻辑的好地方,例如为比例或样本用户启用功能。
默认解析
在默认实现中,当两个功能一起解析时,将显示最终控制状态的 Feature
为粗体。
先前状态 | 新状态 |
---|---|
激活 | 激活 |
激活 | 未激活 |
激活 | 未知 |
未激活 | 激活 |
未激活 | 未激活 |
未激活 | 未知 |
未知 | 激活 |
未知 | 未激活 |
未知 | 未知 |