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 typedfeature('flag'), feature_value('flag', default)Hook for logging, tracing, validationEvaluationContextProviderInterface to feed targeting attributesopen-feature/sdk ^2.2 (implements OpenFeature spec v0.5.1)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) }}
The bundle works with any OpenFeature provider.
For anything beyond a quick demo (user targeting, percentage rollouts, A/B testing, remote flag management, audit log), use a dedicated provider:
aubes/openfeature-flagd-bundle : self-hosted Flagd backend from the OpenFeature projectaubes/openfeature-configcat-bundle : ConfigCat SaaSWarning: 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 |
Combine several providers through the SDK MultiProvider with the providers key (evaluated in declaration order):
open_feature:
providers:
remote: App\OpenFeature\MyProvider
local: Aubes\OpenFeatureBundle\Provider\InMemoryProvider
strategy: first_match # first_match | first_successful | comparison
See Configuration reference for strategy details.
Full documentation lives in the docs/ folder:
MIT. See LICENSE.
How can I help you explore Laravel packages today?