Remote Config¶
Change the behavior and appearance of your app without publishing an app update.
Firebase Remote Config is a cloud service that lets you change the behavior and appearance of your app without requiring users to download an app update. When using Remote Config, you create in-app default values that control the behavior and appearance of your app.
Before you start, please read about Firebase Remote Config in the official documentation:
Before you begin¶
For Firebase projects created before the March 7, 2018 release of the Remote Config REST API, you must enable the API in the Google APIs console.
Open the Firebase Remote Config API page in the Google APIs console.
When prompted, select your Firebase project. (Every Firebase project has a corresponding project in the Google APIs console.)
Click Enable on the Firebase Remote Config API page.
Initializing the Realtime Database component¶
With the SDK
$remoteConfig = $factory->createRemoteConfig();
With Dependency Injection (Symfony Bundle/Laravel/Lumen Package)
use Kreait\Firebase\Contract\RemoteConfig;
class MyService
{
public function __construct(RemoteConfig $remoteConfig)
{
$this->remoteConfig = $remoteConfig;
}
}
With the Laravel app()
helper (Laravel/Lumen Package)
$remoteConfig = app('firebase.remote_config');
Get the Remote Config¶
$template = $remoteConfig->get(); // Returns a Kreait\Firebase\RemoteConfig\Template
$version = $template->version(); // Returns a Kreait\Firebase\RemoteConfig\Version
Create a new Remote Config¶
use Kreait\Firebase\RemoteConfig;
$template = RemoteConfig\Template::new();
Add a condition¶
use Kreait\Firebase\RemoteConfig;
$germanLanguageCondition = RemoteConfig\Condition::named('lang_german')
->withExpression("device.language in ['de', 'de_AT', 'de_CH']")
->withTagColor(TagColor::ORANGE); // The TagColor is optional
$frenchLanguageCondition = Condition::named('lang_french')
->withExpression("device.language in ['fr', 'fr_CA', 'fr_CH']")
->withTagColor(TagColor::GREEN);
$template = $template
->withCondition($germanLanguageCondition)
->withCondition($frenchLanguageCondition)
;
$conditionNames = $template->conditionNames();
// Returns ['lang_german', 'lang_french']
Add a parameter¶
use Kreait\Firebase\RemoteConfig;
use Kreait\Firebase\RemoteConfig\ParameterValueType;
$welcomeMessageParameter = RemoteConfig\Parameter::named('welcome_message')
->withDefaultValue('Welcome!')
->withDescription('This is a welcome message') // optional
->withValueType(ParameterValueType $valueType): self
;
Parameter Value Types¶
Note
Support for Parameter Value Types has been added in version 7.4.0 of the SDK
use Kreait\Firebase\RemoteConfig\Parameter;
use Kreait\Firebase\RemoteConfig\ParameterValueType;
Parameter::named('string_parameter')
->withDefaultValue('Welcome!')
->withValueType(ParameterValueType::STRING);
Parameter::named('boolean_parameter')
->withDefaultValue('true')
->withValueType(ParameterValueType::BOOL);
Parameter::named('numeric_parameter')
->withDefaultValue('5')
->withValueType(ParameterValueType::NUMBER);
Parameter::named('json_parameter')
->withDefaultValue('{"foo": "bar"}')
->withValueType(ParameterValueType::JSON);
Conditional values¶
use Kreait\Firebase\RemoteConfig;
$germanLanguageCondition = RemoteConfig\Condition::named('lang_german')
->withExpression("device.language in ['de', 'de_AT', 'de_CH']");
$germanWelcomeMessage = RemoteConfig\ConditionalValue::basedOn($germanLanguageCondition)->withValue('Willkommen!');
$welcomeMessageParameter = RemoteConfig\Parameter::named('welcome_message')
->withDefaultValue('Welcome!')
->withConditionalValue($germanWelcomeMessage);
$template = $template
->withCondition($germanLanguageCondition)
->withParameter($welcomeMessageParameter);
Note
When you use a conditional value, make sure to add the corresponding condition to the template first.
Parameter Groups¶
use Kreait\Firebase\RemoteConfig;
$uiColors = RemoteConfig\ParameterGroup::named('UI Colors')
->withDescription('Remote configurable UI colors')
->withParameter(RemoteConfig\Parameter::named('Primary Color')->withDefaultValue('blue'))
->withParameter(RemoteConfig\Parameter::named('Secondary Color')->withDefaultValue('red'))
;
$template = $template->withParameterGroup($parameterGroup);
Removing Remote Config Elements¶
You can remove elements from a Remote Config template with the following methods:
$template = Template::new()
->withCondition(Condition::named('condition'))
->withParameter(Parameter::named('parameter'))
->withParameterGroup(ParameterGroup::named('group'))
$template = $template
->withRemovedCondition('condition')
->withRemovedParameter('parameter')
->withRemovedParameterGroup('group');
Validation¶
Usually, the SDK will protect you from creating an invalid Remote Config template in the first place. If you want to be sure, you can validate the template with a call to the Firebase API:
use Kreait\Firebase\Exception\RemoteConfig\ValidationFailed;
try {
$remoteConfig->validate($template);
} catch (ValidationFailed $e) {
echo $e->getMessage();
}
Note
The ValidationFailed
exception extends Kreait\Firebase\Exception\RemoteConfigException
,
so you can safely use the more generic exception type as well.
Publish the Remote Config¶
use Kreait\Firebase\Exception\RemoteConfigException
try {
$remoteConfig->publish($template);
} catch (RemoteConfigException $e) {
echo $e->getMessage();
}
Remote Config history¶
Since August 23, 2018, Firebase provides a change history for your published Remote configs.
The following properties are available from a Kreait\Firebase\RemoteConfig\Version
object:
$version->versionNumber();
$version->user(); // The user/service account the performed the change
$version->description();
$version->updatedAt();
$version->updateOrigin();
$version->updateType();
$version->rollBackSource();
List versions¶
To enhance performance and prevent memory issues when retrieving a huge amount of versions, this methods returns a Generator.
foreach ($auth->listVersions() as $version) {
/** @var \Kreait\Firebase\RemoteConfig\Version $version */
// ...
}
// or
array_map(function (\Kreait\Firebase\RemoteConfig\Version $version) {
// ...
}, iterator_to_array($auth->listVersions()));
Filtering¶
You can filter the results of RemoteConfig::listVersions()
:
use Kreait\Firebase\RemoteConfig\FindVersions;
$query = FindVersions::all()
// Versions created/updated after August 1st, 2019 at midnight
->startingAt(new DateTime('2019-08-01 00:00:00'))
// Versions created/updated before August 7th, 2019 at the end of the day
->endingAt(new DateTime('2019-08-06 23:59:59'))
// Versions with version numbers smaller than 3464
->upToVersion(VersionNumber::fromValue(3463))
// Setting a page size can results in faster first results,
// but results in more request
->withPageSize(5)
// Stop querying after the first 10 results
->withLimit(10)
;
// Alternative array notation
$query = [
'startingAt' => '2019-08-01',
'endingAt' => '2019-08-07',
'upToVersion' => 9999,
'pageSize' => 5,
'limit' => 10,
];
foreach ($remoteConfig->listVersions($query) as $version) {
echo "Version number: {$version->versionNumber()}\n";
echo "Last updated at {$version->updatedAt()->format('Y-m-d H:i:s')}\n";
// ...
echo "\n---\n";
}
Get a specific version¶
$version = $remoteConfig->getVersion($versionNumber);
Rollback to a version¶
$template = $remoteConfig->rollbackToVersion($versionNumber);