PHP code example of avsbhq / avsb

1. Go to this page and download the library: Download avsbhq/avsb library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

avsbhq / avsb example snippets




use Avsbhq\Avsb\AvsbServer;
use Avsbhq\Avsb\EvalContext;

$server = new AvsbServer($_ENV['AVSB_SDK_KEY']);

$flag = $server->getBoolFlag('checkout_v2', false, EvalContext::user('alice', [
    'plan' => 'pro',
]));

if ($flag->value) {
    // serve the new checkout
}

$server->track('checkout_completed', EvalContext::user('alice'), revenue: 49.99);

$datafile = json_decode(file_get_contents('/var/run/avsb/datafile.json'), true);
$server = AvsbServer::fromDatafile($datafile);

use Avsbhq\Avsb\AvsbServer;
use Avsbhq\Avsb\AvsbServerOptions;
use Avsbhq\Avsb\Datafile\FileDatafileCache;

$server = new AvsbServer($_ENV['AVSB_SDK_KEY'], new AvsbServerOptions(
    logger: $psr3Logger,
    cache: new FileDatafileCache('/dev/shm/avsb'),
    datafileTtlSeconds: 30,
    fetchTimeoutSeconds: 2.0,
    stickyBucketService: $redisStickyStore,
));

// AvsbServerOptions::__construct(
//     ?array $datafile = null,
//     ?LoggerInterface $logger = null,
//     ?DecisionLog $decisionLog = null,
//     ?HttpTransport $transport = null,
//     ?DatafileCache $cache = null,
//     string $cdnHost = Endpoints::DEFAULT_CDN_HOST,
//     int $datafileTtlSeconds = 60,
//     float $fetchTimeoutSeconds = 5.0,
//     bool $events = true,
//     bool $flushEventsOnShutdown = true,
//     ?StickyBucketService $stickyBucketService = null,
//     ?BanditModelStore $banditModelStore = null,
//     mixed $onStickyOrphan = null,
//     bool $heartbeat = true,
// )

use Avsbhq\Avsb\Http\Psr18Transport;

$options = new AvsbServerOptions(
    transport: new Psr18Transport($psr18Client, $psr17RequestFactory, $psr17StreamFactory),
);

use Avsbhq\Avsb\EvalContext;

$context = EvalContext::user('alice', [
    'plan' => 'pro',            // targeting attributes, any JSON value
    'betaTester' => true,
]);

// Any single kind
$org = EvalContext::user('acme-corp', ['tier' => 'enterprise'], 'organization');

// Several kinds at once
$context = EvalContext::multi([
    'user'         => ['key' => 'alice', 'plan' => 'pro'],
    'organization' => ['key' => 'acme', 'tier' => 'enterprise'],
]);

// Or wrap a decoded array already in the wire shape
$context = EvalContext::fromArray($decoded);

// AvsbServer::getBoolFlag(string $key, bool $defaultValue, ?EvalContext $context = null): Flag
$showBanner = $server->getBoolFlag('promo_banner', false, $context);

// AvsbServer::getStringFlag(string $key, string $defaultValue, ?EvalContext $context = null): Flag
$theme = $server->getStringFlag('ui_theme', 'light', $context);

// AvsbServer::getNumberFlag(string $key, float $defaultValue, ?EvalContext $context = null): Flag
$maxRetries = $server->getNumberFlag('max_retries', 3.0, $context);

// AvsbServer::getJsonFlag(string $key, mixed $defaultValue, ?EvalContext $context = null): Flag
$config = $server->getJsonFlag('api_config', [], $context);

$flag = $server->getBoolFlag('checkout_v2', false, $context);

$flag->value;           // mixed             the evaluated value
$flag->variationKey;    // string|null       null for default, not_found, not_ready
$flag->source;          // EvaluationSource  why this value (enum, see below)
$flag->ruleId;          // string|null       the rule or holdout that decided
$flag->ruleType;        // RuleType|null     AbTest, TargetedDelivery, Holdout, Bandit
$flag->reasons;         // list<string>      the decision trail, in order
$flag->evaluatedAt;     // int               milliseconds since the Unix epoch
$flag->durationMicros;  // int               microseconds spent evaluating
$flag->isEnabled();     // bool
$flag->exists();        // bool

$server->isReady();      // bool
$server->initResult();   // ['success' => bool, 'source' => string, 'error' => ?string]
                         // source: bootstrap, cache, network, or error

use Avsbhq\Avsb\DecisionLog;

$log = new DecisionLog();
$server = new AvsbServer($sdkKey, new AvsbServerOptions(decisionLog: $log));

$server->getBoolFlag('checkout_v2', false, $context);

foreach ($log->getEntries() as $entry) {
    echo $entry->flagKey . ': ' . json_encode($entry->value) . PHP_EOL;
}

// AvsbServer::track(string $eventName, EvalContext $context, ?float $revenue = null, ?float $value = null): void
$server->track('signup_completed', $context);
$server->track('checkout_completed', $context, revenue: 49.99);
$server->track('items_per_order', $context, value: 3.0);

use Avsbhq\Avsb\PurchaseOrder;

// AvsbServer::trackPurchase(EvalContext $context, PurchaseOrder $order): bool
$server->trackPurchase($context, new PurchaseOrder(
    orderId: 'ORD-1001',
    total: 99.95,
    currency: 'USD',
    items: [['sku' => 'SKU-1', 'price' => 99.95, 'quantity' => 1]],
));

use Avsbhq\Avsb\Sticky\RedisStickyBucketService;

$server = new AvsbServer($sdkKey, new AvsbServerOptions(
    stickyBucketService: new RedisStickyBucketService($redis),
));

$server = new AvsbServer($sdkKey, new AvsbServerOptions(logger: $monolog));

'providers' => [
    Avsbhq\Avsb\Middleware\Laravel\ServiceProvider::class,
],

return [
    'sdk_key'       => env('AVSB_SDK_KEY', ''),
    // Optional: point at a datafile another process keeps fresh (the agent
    // shape). When the file exists it wins and the SDK never fetches.
    'datafile_path' => env('AVSB_DATAFILE_PATH', ''),
];

public function __construct(private readonly AvsbServer $avsb) {}

// app/Http/Kernel.php
protected $routeMiddleware = [
    'avsb' => \Avsbhq\Avsb\Middleware\Laravel\Middleware::class,
];

$context = $request->attributes->get('avsb_context');

// config/bundles.php
return [
    Avsbhq\Avsb\Middleware\Symfony\Bundle::class => ['all' => true],
];

class CheckoutController extends AbstractController
{
    public function __construct(private readonly AvsbServer $avsb) {}

    public function index(Request $request): Response
    {
        $context = $request->attributes->get('avsb_context')
            ?? EvalContext::user((string) $this->getUser()?->getId());
        $flag = $this->avsb->getBoolFlag('checkout_v2', false, $context);
        // ...
    }
}

use Avsbhq\Avsb\EvalContext;
use Avsbhq\Avsb\TestUtils\InMemoryDatafileLoader;
use PHPUnit\Framework\TestCase;

final class CheckoutFlagTest extends TestCase
{
    public function testTheFlagIsOnForEveryone(): void
    {
        $server = InMemoryDatafileLoader::fromJson(<<<'JSON'
        {
          "version": 2,
          "sdkKey": "sdk_test_conformancefixture01",
          "flags": [{
            "id": "flag_checkout",
            "key": "checkout_v2",
            "type": "boolean",
            "enabled": true,
            "defaultVariationId": "var_off",
            "variations": [
              {"id": "var_off", "key": "off", "value": false},
              {"id": "var_on",  "key": "on",  "value": true}
            ],
            "overrides": [],
            "rules": [{
              "id": "rule_all",
              "type": "targeted_delivery",
              "enabled": true,
              "audienceIds": [],
              "hashAttribute": "user.key",
              "trafficAllocation": null,
              "variations": [{"variationId": "var_on", "percentage": 1}]
            }]
          }],
          "audiences": []
        }
        JSON);

        $flag = $server->getBoolFlag('checkout_v2', false, EvalContext::user('alice'));

        self::assertTrue($flag->value);
        self::assertTrue($flag->isEnabled());
        self::assertSame('rule', $flag->source->value);
    }
}

use Avsbhq\Avsb\OpenFeatureProvider;

$provider = new OpenFeatureProvider($server);

// LaunchDarkly
$client = new LDClient('sdk-key');
$value  = $client->variation('checkout_v2', LDContext::create('alice'), false);

// A vs B
$server = new AvsbServer($_ENV['AVSB_SDK_KEY']);
$value  = $server->getBoolFlag('checkout_v2', false, EvalContext::user('alice'))->value;