configcat/openfeature-provider
OpenFeature provider for PHP that connects the OpenFeature PHP SDK to ConfigCat. Configure with your ConfigCat SDK key and optional client options, then evaluate feature flags via the OpenFeature client (boolean, string, etc.). PHP 8.1+.
Install the Package
composer require configcat/openfeature-provider
Ensure your project meets the PHP 8.1+ requirement.
Initialize OpenFeature
use OpenFeature\Api\OpenFeatureAPI;
use ConfigCat\OpenFeature\ConfigCatProvider;
$api = OpenFeatureAPI::getInstance();
$api->setProvider(new ConfigCatProvider('YOUR_SDK_KEY'));
First Feature Flag Evaluation
$client = $api->getClient();
$isFeatureEnabled = $client->getBooleanValue('my_flag_key', false);
getStringValue, getIntegerValue).Provider Initialization
$api->setProvider(new ConfigCatProvider(
sdkKey: 'YOUR_KEY',
options: [
ClientOptions::LOG_LEVEL => LogLevel::ERROR, // Reduce noise in production
ClientOptions::CACHE_REFRESH_INTERVAL => 60, // Sync flags every minute
]
));
LogLevel::ERROR in production to avoid logging sensitive flag evaluations.Flag Evaluation in Controllers/Services
public function showDashboard(Request $request) {
$client = OpenFeatureAPI::getInstance()->getClient();
$user = $request->user();
// Target flags to specific users/groups
$client->setTargetingContext([
'userId' => $user->id,
'email' => $user->email,
]);
if ($client->getBooleanValue('new_dashboard_ui', false)) {
return view('dashboard.new');
}
return view('dashboard.legacy');
}
Multi-Type Flags
$timeout = $client->getIntegerValue('api_timeout_ms', 5000);
$env = $client->getStringValue('app_environment', 'staging');
Lazy Initialization
// Cache the OpenFeature client in a service container (Laravel)
$this->app->singleton(OpenFeatureClient::class, function ($app) {
$api = OpenFeatureAPI::getInstance();
$api->setProvider(new ConfigCatProvider(config('configcat.sdk_key')));
return $api->getClient();
});
Dynamic SDK Key (Multi-Tenant)
$provider = new ConfigCatProvider(
tenantSdkKey: $tenant->configcat_key,
options: ['cacheRefreshInterval' => 30]
);
$api->setProvider($provider);
Fallback Logic
$isEnabled = $client->getBooleanValue('experimental_feature', false);
if (!$isEnabled) {
// Fallback behavior
Log::info('Feature disabled; using default workflow.');
}
Laravel Service Providers
Bind the provider in AppServiceProvider:
public function boot() {
OpenFeatureAPI::getInstance()->setProvider(
new ConfigCatProvider(config('configcat.sdk_key'))
);
}
Testing Use ConfigCat’s sandbox mode or mock the provider for unit tests:
$mockProvider = $this->createMock(ConfigCatProvider::class);
$mockProvider->method('getValue')->willReturn(true);
OpenFeatureAPI::getInstance()->setProvider($mockProvider);
SDK Key Mismatch
null or default values unexpectedly.LogLevel::DEBUG logs for connection errors.Caching Quirks
cacheRefreshInterval.5 seconds) during development, but increase it (e.g., 60) in production to reduce API calls.forceRefresh() (if supported by the underlying ConfigCat SDK) for critical flags:
$client->getValue('critical_flag', false, true); // Force refresh
Context Targeting
$client->setTargetingContext(['userId' => '123']);
$isEnabled = $client->getBooleanValue('premium_feature', false);
Provider Singleton
OpenFeatureAPI may cause conflicts.OpenFeatureAPI::getInstance()->reset();
Enable Debug Logging
$options = [ClientOptions::LOG_LEVEL => LogLevel::DEBUG];
$api->setProvider(new ConfigCatProvider('KEY', $options));
Flag 'flag_key' resolved to: true).Validate Flag Keys
new_ui vs. newUI) will return defaults. Use the ConfigCat Dashboard to verify keys.Network Issues
https://cdn.configcat.com.LogLevel::DEBUG).Custom Providers
ConfigCatProvider to add middleware for flag evaluations:
class CustomConfigCatProvider extends ConfigCatProvider {
public function getValue(string $flagKey, mixed $defaultValue): mixed {
// Pre-process flag key or context
return parent::getValue($flagKey, $defaultValue);
}
}
Hybrid Providers
$api->setProvider(new HybridProvider([
new ConfigCatProvider('primary_key'),
new JsonFileProvider('backup_flags.json'),
]));
Event Listeners
ConfigCat::getInstance()->addEventListener(new class implements ConfigCatEventListener {
public function onConfigurationChanged(ConfigCatConfigurationChangedEvent $event) {
Log::info('Flags refreshed at: ' . $event->getTimestamp());
}
});
Offline Mode
$options = [
ClientOptions::OFFLINE => true,
ClientOptions::CACHE_REFRESH_INTERVAL => 0,
];
Environment Variables
.env:
CONFIGCAT_SDK_KEY=your_key_here
$api->setProvider(new ConfigCatProvider(config('configcat.sdk_key')));
How can I help you explore Laravel packages today?