|
|
@@ -211,7 +211,7 @@ class AppConfig implements IAppConfig { |
|
|
|
* @param string $prefix config keys prefix to search |
|
|
|
* @param bool $filtered TRUE to hide sensitive config values. Value are replaced by {@see IConfig::SENSITIVE_VALUE} |
|
|
|
* |
|
|
|
* @return array<string, string> [configKey => configValue] |
|
|
|
* @return array<string, string|int|float|bool|array> [configKey => configValue] |
|
|
|
* @since 29.0.0 |
|
|
|
*/ |
|
|
|
public function getAllValues(string $app, string $prefix = '', bool $filtered = false): array { |
|
|
@@ -219,8 +219,9 @@ class AppConfig implements IAppConfig { |
|
|
|
// if we want to filter values, we need to get sensitivity |
|
|
|
$this->loadConfigAll(); |
|
|
|
// array_merge() will remove numeric keys (here config keys), so addition arrays instead |
|
|
|
$values = $this->formatAppValues($app, ($this->fastCache[$app] ?? []) + ($this->lazyCache[$app] ?? [])); |
|
|
|
$values = array_filter( |
|
|
|
(($this->fastCache[$app] ?? []) + ($this->lazyCache[$app] ?? [])), |
|
|
|
$values, |
|
|
|
function (string $key) use ($prefix): bool { |
|
|
|
return str_starts_with($key, $prefix); // filter values based on $prefix |
|
|
|
}, ARRAY_FILTER_USE_KEY |
|
|
@@ -253,14 +254,14 @@ class AppConfig implements IAppConfig { |
|
|
|
* |
|
|
|
* @param string $key config key |
|
|
|
* @param bool $lazy search within lazy loaded config |
|
|
|
* @param int|null $typedAs enforce type for the returned values ({@see self::VALUE_STRING} and others) |
|
|
|
* |
|
|
|
* @return array<string, string> [appId => configValue] |
|
|
|
* @return array<string, string|int|float|bool|array> [appId => configValue] |
|
|
|
* @since 29.0.0 |
|
|
|
*/ |
|
|
|
public function searchValues(string $key, bool $lazy = false): array { |
|
|
|
public function searchValues(string $key, bool $lazy = false, ?int $typedAs = null): array { |
|
|
|
$this->assertParams('', $key, true); |
|
|
|
$this->loadConfig($lazy); |
|
|
|
$values = []; |
|
|
|
|
|
|
|
/** @var array<array-key, array<array-key, mixed>> $cache */ |
|
|
|
if ($lazy) { |
|
|
@@ -269,9 +270,10 @@ class AppConfig implements IAppConfig { |
|
|
|
$cache = $this->fastCache; |
|
|
|
} |
|
|
|
|
|
|
|
$values = []; |
|
|
|
foreach (array_keys($cache) as $app) { |
|
|
|
if (isset($cache[$app][$key])) { |
|
|
|
$values[$app] = $cache[$app][$key]; |
|
|
|
$values[$app] = $this->convertTypedValue($cache[$app][$key], $typedAs ?? $this->getValueType((string)$app, $key, $lazy)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -510,9 +512,9 @@ class AppConfig implements IAppConfig { |
|
|
|
* @see VALUE_BOOL |
|
|
|
* @see VALUE_ARRAY |
|
|
|
*/ |
|
|
|
public function getValueType(string $app, string $key): int { |
|
|
|
public function getValueType(string $app, string $key, ?bool $lazy = null): int { |
|
|
|
$this->assertParams($app, $key); |
|
|
|
$this->loadConfigAll(); |
|
|
|
$this->loadConfig($lazy); |
|
|
|
|
|
|
|
if (!isset($this->valueTypes[$app][$key])) { |
|
|
|
throw new AppConfigUnknownKeyException('unknown config key'); |
|
|
@@ -1369,7 +1371,7 @@ class AppConfig implements IAppConfig { |
|
|
|
|
|
|
|
$key = ($key === false) ? '' : $key; |
|
|
|
if (!$app) { |
|
|
|
return $this->searchValues($key); |
|
|
|
return $this->searchValues($key, false, self::VALUE_MIXED); |
|
|
|
} else { |
|
|
|
return $this->getAllValues($app, $key); |
|
|
|
} |
|
|
@@ -1387,6 +1389,58 @@ class AppConfig implements IAppConfig { |
|
|
|
return $this->getAllValues($app, filtered: true); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* **Warning:** avoid default NULL value for $lazy as this will |
|
|
|
* load all lazy values from the database |
|
|
|
* |
|
|
|
* @param string $app |
|
|
|
* @param array<string, string> $values ['key' => 'value'] |
|
|
|
* @param bool|null $lazy |
|
|
|
* |
|
|
|
* @return array<string, string|int|float|bool|array> |
|
|
|
*/ |
|
|
|
private function formatAppValues(string $app, array $values, ?bool $lazy = null): array { |
|
|
|
foreach($values as $key => $value) { |
|
|
|
try { |
|
|
|
$type = $this->getValueType($app, $key, $lazy); |
|
|
|
} catch (AppConfigUnknownKeyException $e) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
$values[$key] = $this->convertTypedValue($value, $type); |
|
|
|
} |
|
|
|
|
|
|
|
return $values; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* convert string value to the expected type |
|
|
|
* |
|
|
|
* @param string $value |
|
|
|
* @param int $type |
|
|
|
* |
|
|
|
* @return string|int|float|bool|array |
|
|
|
*/ |
|
|
|
private function convertTypedValue(string $value, int $type): string|int|float|bool|array { |
|
|
|
switch ($type) { |
|
|
|
case self::VALUE_INT: |
|
|
|
return (int)$value; |
|
|
|
case self::VALUE_FLOAT: |
|
|
|
return (float)$value; |
|
|
|
case self::VALUE_BOOL: |
|
|
|
return in_array(strtolower($value), ['1', 'true', 'yes', 'on']); |
|
|
|
case self::VALUE_ARRAY: |
|
|
|
try { |
|
|
|
return json_decode($value, true, flags: JSON_THROW_ON_ERROR); |
|
|
|
} catch (JsonException $e) { |
|
|
|
// ignoreable |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
return $value; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param string $app |
|
|
|
* |