Skip to content

Latest commit

 

History

History
118 lines (88 loc) · 4.35 KB

File metadata and controls

118 lines (88 loc) · 4.35 KB

OpenFeature Bundle

CI Latest Version PHP Version Symfony Version

Feature flags, the Symfony way.

Symfony bundle for the OpenFeature PHP SDK — the CNCF standard for feature flags.

class CheckoutController
{
    #[FeatureGate('new_checkout')]
    public function checkout(
        #[FeatureFlag('dark_mode')] bool $darkMode,
        #[FeatureFlag('max_items')] int $maxItems,
    ): Response {
        // values resolved from your feature flag provider
    }
}
  • #[FeatureGate] blocks access when a flag is off
  • #[FeatureFlag] injects resolved values, fully typed
  • Twig helpers: feature('flag'), feature_value('flag', default)
  • Symfony Profiler panel with evaluated flags, provider info, and context
  • Any provider: basic built-ins (InMemory, EnvVar, Redis) for quick starts, or plug any real OpenFeature provider (Flagd, ConfigCat, Unleash, LaunchDarkly...)
  • FrankenPHP worker mode safe out of the box

Requirements

Quick start

composer require aubes/openfeature-bundle

Register the bundle manually in config/bundles.php:

Aubes\OpenFeatureBundle\OpenFeatureBundle::class => ['all' => true],
# config/packages/open_feature.yaml
open_feature:
    flags:
        new_checkout: true
        dark_mode: false
        max_items: 10

Use flags in controllers with attributes, in templates with Twig, or inject the Client directly:

use OpenFeature\interfaces\flags\Client;

class MyService
{
    public function __construct(private readonly Client $client) {}

    public function checkout(): void
    {
        if ($this->client->getBooleanValue('new_checkout', false)) {
            // new flow
        }
    }
}
{% if feature('new_checkout') %}
    {# new checkout #}
{% endif %}

{{ feature_value('max_items', 10) }}

Providers

The bundle works with any OpenFeature provider.

Use a real provider in production

For anything beyond a quick demo (user targeting, percentage rollouts, A/B testing, remote flag management, audit log), use a dedicated provider:

Built-in providers (bootstrap only)

Warning: The three built-in providers are simple key/value stores. They ignore the EvaluationContext (no targeting, no rollouts, no A/B testing) and are only meant to get you running without setting up infrastructure. Swap them out as soon as you need real feature flag semantics.

Provider Best for Config key
InMemoryProvider (default) Local development, tests flags
EnvVarProvider Kill switches via env vars provider
RedisProvider Shared on/off toggles via Redis provider + redis

Documentation

Full documentation lives in the docs/ folder:

License

MIT. See LICENSE.