dose/功能

简单的功能API,支持快速开发和A/B测试。

1.0.0 2016-02-03 15:16 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:26:14 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

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%的访客开启。