rex_config
Persistente Konfigurationsspeicherung (Datenbank + File-Cache)
Keywords: config, settings, namespace, cache, addon-settings
Methodenübersicht
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
set() |
string $namespace, string\|array $key, mixed $value = null |
bool |
Wert speichern, true bei Überschreibung |
get() |
string $namespace, string\|null $key = null, mixed $default = null |
mixed\|array |
Wert lesen, Array bei $key = null |
has() |
string $namespace, string\|null $key = null |
bool |
Prüft ob Namespace/Key existiert |
remove() |
string $namespace, string $key |
bool |
Wert löschen |
removeNamespace() |
string $namespace |
bool |
Alle Werte eines Namespace löschen |
refresh() |
- | void |
Neu laden aus DB (bei Änderungen außerhalb) |
save() |
- | void |
Manuelles Speichern (automatisch bei Shutdown) |
Praxisbeispiele
Basis-Verwendung
// Einzelnen Wert setzen
rex_config::set('myaddon', 'api_key', 'abc123');
rex_config::set('myaddon', 'timeout', 30);
rex_config::set('myaddon', 'enabled', true);
// Wert lesen
$apiKey = rex_config::get('myaddon', 'api_key'); // "abc123"
$timeout = rex_config::get('myaddon', 'timeout', 60); // 30 (oder 60 als Default)
// Prüfen ob Wert existiert
if (rex_config::has('myaddon', 'api_key')) {
// Key vorhanden
}
// Wert löschen
rex_config::remove('myaddon', 'old_setting');
Mehrere Werte auf einmal setzen
// Array-Schreibweise
rex_config::set('myaddon', [
'api_key' => 'abc123',
'timeout' => 30,
'enabled' => true,
'options' => ['option1', 'option2']
]);
// Alle Werte eines Namespace lesen
$config = rex_config::get('myaddon'); // Komplettes Array
// ['api_key' => 'abc123', 'timeout' => 30, ...]
Komplexe Datentypen
// Arrays, Objekte (als JSON gespeichert)
rex_config::set('myaddon', 'categories', [1, 5, 12]);
rex_config::set('myaddon', 'settings', [
'debug' => false,
'cache_ttl' => 3600,
'endpoints' => ['api1', 'api2']
]);
// Nested Arrays
$config = [
'api' => [
'key' => 'xxx',
'secret' => 'yyy',
'url' => 'https://api.example.com'
],
'display' => [
'items_per_page' => 20,
'sort' => 'desc'
]
];
rex_config::set('myaddon', $config);
// Zugriff
$api = rex_config::get('myaddon', 'api');
$apiKey = $api['key']; // 'xxx'
Package-Integration
// Via rex_addon (Shortcut)
$addon = rex_addon::get('myaddon');
// Setzen
$addon->setConfig('api_key', 'abc123');
$addon->setConfig([
'enabled' => true,
'timeout' => 30
]);
// Lesen
$apiKey = $addon->getConfig('api_key');
$config = $addon->getConfig(); // Alle Werte
// Prüfen
if ($addon->hasConfig('api_key')) {
// ...
}
// Löschen
$addon->removeConfig('old_setting');
// Intern ruft dies rex_config auf:
// $addon->setConfig('key', 'val') => rex_config::set('myaddon', 'key', 'val')
Installations-Routine
// install.php eines Addons
$addon = rex_addon::get('myaddon');
// Default-Config bei Installation
if (!$addon->hasConfig()) {
$addon->setConfig([
'api_key' => '',
'timeout' => 30,
'enabled' => false,
'cache_ttl' => 3600,
'debug' => false
]);
}
Deinstallations-Routine
// uninstall.php eines Addons
$addon = rex_addon::get('myaddon');
// Alle Config-Werte löschen
rex_config::removeNamespace('myaddon');
// Oder via Addon-API
// (entfernt auch Daten, aber nicht Config automatisch!)
Backend-Settings-Formular
// pages/settings.php
$addon = rex_addon::get('myaddon');
if (rex_request::isPOSTRequest()) {
$apiKey = rex_post('api_key', 'string');
$timeout = rex_post('timeout', 'int', 30);
$enabled = rex_post('enabled', 'bool');
$addon->setConfig('api_key', $apiKey);
$addon->setConfig('timeout', $timeout);
$addon->setConfig('enabled', $enabled);
echo rex_view::success('Einstellungen gespeichert.');
}
$content = '
<form method="post">
<fieldset>
<legend>API-Einstellungen</legend>
<div class="form-group">
<label>API-Key</label>
<input type="text" name="api_key" class="form-control"
value="' . rex_escape($addon->getConfig('api_key')) . '">
</div>
<div class="form-group">
<label>Timeout (Sekunden)</label>
<input type="number" name="timeout" class="form-control"
value="' . $addon->getConfig('timeout', 30) . '">
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="enabled" value="1"
' . ($addon->getConfig('enabled') ? 'checked' : '') . '>
Aktiviert
</label>
</div>
</fieldset>
<button type="submit" class="btn btn-save">Speichern</button>
</form>';
echo rex_view::content($content, 'Einstellungen');
rex_config_form (Vereinfacht)
// pages/settings.php mit rex_config_form
$form = rex_config_form::factory('myaddon');
$form->addFieldset('API-Einstellungen');
$field = $form->addTextField('api_key');
$field->setLabel('API-Key');
$field = $form->addTextField('timeout');
$field->setLabel('Timeout (Sekunden)');
$field->getValidator()->add('match', '/^\d+$/');
$field = $form->addCheckboxField('enabled');
$field->addOption('Aktiviert', 1);
$field->setLabel('Status');
echo $form->get();
Caching-Verhalten
// rex_config cached automatisch in Datei:
// rex_path::coreCache('config.cache')
// Bei Änderungen:
rex_config::set('myaddon', 'key', 'value');
// 1. Änderung wird in Memory gehalten
// 2. Bei Shutdown: Speichern in DB + Cache-File löschen
// 3. Nächster Request: Neu laden aus DB + Cache-File erstellen
// Manuelles Refresh (falls DB extern geändert wurde)
rex_config::refresh();
// Manuelles Speichern (normalerweise nicht nötig)
rex_config::save();
Multi-Environment Config
// Environment-spezifische Einstellungen
$env = rex::getEnvironment(); // 'frontend', 'backend', 'console'
rex_config::set('myaddon', 'debug_' . $env, true);
if (rex_config::get('myaddon', 'debug_' . rex::getEnvironment())) {
// Debug aktiv für aktuelle Environment
}
Migration / Import
// Export aller Einstellungen
$allConfig = rex_config::get('myaddon');
$json = json_encode($allConfig, JSON_PRETTY_PRINT);
rex_file::put(rex_path::addonData('myaddon', 'config_backup.json'), $json);
// Import
$json = rex_file::get(rex_path::addonData('myaddon', 'config_backup.json'));
$config = json_decode($json, true);
rex_config::set('myaddon', $config);
Namespace-Patterns
// Addon-Config
rex_config::set('myaddon', 'key', 'value');
// Plugin-Config (gleicher Namespace wie Addon!)
rex_plugin::get('myaddon', 'myplugin')->setConfig('plugin_key', 'value');
// Intern: rex_config::set('myaddon', 'plugin_key', 'value')
// Separater Plugin-Namespace (manuell)
rex_config::set('myaddon/myplugin', 'key', 'value');
// Core-Config (über rex::setConfig)
rex::setConfig('server', 'https://example.com');
// Intern: rex_config::set('core', 'server', 'https://example.com')
Speicherung:
- Datenbank-Tabelle:
rex_config(namespace, key, value als JSON) - File-Cache:
rex_path::coreCache('config.cache')(automatisch generiert) - Auto-Save bei
register_shutdown_function()(kein manuelles Speichern nötig)
Best Practices:
- ✅ Namespace = Addon-Name (Konsistenz)
- ✅
setConfig()/getConfig()via rex_addon nutzen (Shortcut) - ✅ Defaults immer in
install.phpsetzen - ✅
removeNamespace()inuninstall.phpaufrufen - ⚠️ Keine Passwörter im Klartext (Verschlüsselung via
rex_encode()) - ⚠️ Große Datenmengen nicht in Config speichern (lieber eigene Tabelle)