vend/pheat

此包已被废弃且不再维护。未建议替代包。

特性管理器

v1.0.0 2015-02-22 09:17 UTC

This package is not auto-updated.

Last update: 2022-02-05 02:39:15 UTC


README

PHP 5.4+ 特性管理器

Build Status Code Coverage Scrutinizer Code Quality Latest Stable Version Latest Unstable Version License

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 为粗体。

先前状态 新状态
激活 激活
激活 未激活
激活 未知
未激活 激活
未激活 未激活
未激活 未知
未知 激活
未知 未激活
未知 未知