dose / 功能
简单的功能API,支持快速开发和A/B测试。
Requires
- php: >=5.4.0
Requires (Dev)
- fabpot/php-cs-fixer: 1.*
- phpunit/phpunit: 5.*
This package is not auto-updated.
Last update: 2024-09-14 18:26:14 UTC
README
Feature是一个受Etsy\Feature启发的快速开发和A/B测试库。它不是直接替换,但它可以做Etsy库能做的一切,还能更多。
API
主要方法是
$feature->getVariant($name);
这将返回一个选择的变体。如果没有变体被选择(覆盖率不完整的功能),它也可能返回NULL。
在您可以检查变体之前,您需要定义一些方法,以允许Feature库按需检索您的配置。这是通过将Connector接口的实现注入到Feature实例中完成的。
Connector接口定义了两个方法
getContext();
这用于检索将选择变体的上下文。将为每个上下文单独选择一个变体。大多数情况下,这将设置为唯一的用户ID或会话ID。例如,您可以将其设置为反映文章ID。在这种情况下,所有用户将看到相同的结果,但它在不同的文章之间会改变。
getEntity($name);
此方法允许Feature实例检索用于选择变体的Entity类的实例。
实体
为了定义一个功能,您的getEntity($name)方法的实现需要返回一个Entity实例。一旦您创建了一个Entity对象,就可以使用以下方法向其中添加变体
$entity->addVariant($name, $odds)
这将向功能添加指定的变体。概率范围在0到100之间,不需要是整数。
从Etsy\Feature迁移
我该如何检查功能是否启用?
Etsy的库将功能和变体概念分开;这迫使您在每个对variant()方法的调用周围添加条件。
if (Feature::isEnabled('my_feature')) {
switch (Feature::variant('my_feature')) {
case 'foo':
// do stuff appropriate for the foo variant
break;
case 'bar':
// do stuff appropriate for the bar variant
break;
}
}
我们完全消除了isEnabled($name)方法,并使用getVariant($name)方法来确定功能是否启用
switch $feature->getVariant($name) {
case 'foo':
// do stuff appropriate for the foo variant
break;
case 'bar':
// do stuff appropriate for the bar variant
break;
case null:
// feature is not enabled
break;
}
或者
if ($feature->getVariant($name)) {
// Feature is enabled as long as variant evaluates to true
}
我该如何定义一个50%时间启用且没有变体的功能?
这通过定义一个概率设置为50的单一变体来完成
$entity->addVariant(true, 50);
现在您可以简单地检查选择的变体是否为真
if ($feature->getVariant($name)) {
// Feature is on
}
我该如何定义适用于某些用户或用户组的功能?
这是在配置功能时完成的
if (isAdmin()) {
$entity->addVariant(true, 100);
} else {
$entity->addVariant(true, 20);
}
在上面的例子中,该功能将始终对管理员和20%的访客开启。