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 为粗体。
| 先前状态 | 新状态 |
|---|---|
| 激活 | 激活 |
| 激活 | 未激活 |
| 激活 | 未知 |
| 未激活 | 激活 |
| 未激活 | 未激活 |
| 未激活 | 未知 |
| 未知 | 激活 |
| 未知 | 未激活 |
| 未知 | 未知 |