97 lines
2.7 KiB
PHP
97 lines
2.7 KiB
PHP
<?php
|
||
/**
|
||
* @package Bicycle
|
||
* @author Egor Isaev
|
||
* @description Config.php
|
||
* @copyright (c) 04/06/2026
|
||
*/
|
||
|
||
namespace System\Classes;
|
||
|
||
/**
|
||
* Статический конфиг: lazy-load App/config/config.php
|
||
* с глубоким merge App/config/config.local.php поверх.
|
||
*/
|
||
class Config
|
||
{
|
||
/** @var array|null Загруженный конфиг (null до первой загрузки) */
|
||
private static ?array $config = null;
|
||
|
||
/**
|
||
* Лениво загружает базовый конфиг и мержит локальный поверх.
|
||
*
|
||
* @return void
|
||
*/
|
||
private static function load(): void
|
||
{
|
||
if (self::$config !== null) {
|
||
return;
|
||
}
|
||
|
||
$base = APPPATH . '/config/config.php';
|
||
$local = APPPATH . '/config/config.local.php';
|
||
|
||
$config = file_exists($base) ? (include $base) : [];
|
||
|
||
if (file_exists($local)) {
|
||
$local_config = include $local;
|
||
if (is_array($local_config)) {
|
||
$config = self::merge($config, $local_config);
|
||
}
|
||
}
|
||
|
||
self::$config = $config;
|
||
}
|
||
|
||
/**
|
||
* Возвращает раздел конфига или вложенный ключ.
|
||
*
|
||
* @param string $name Имя раздела
|
||
* @param string|null $group Вложенный ключ внутри раздела
|
||
* @return mixed null, если не найдено
|
||
*/
|
||
public static function get(string $name, ?string $group = null): mixed
|
||
{
|
||
self::load();
|
||
|
||
if ($group === null) {
|
||
return self::$config[$name] ?? null;
|
||
}
|
||
|
||
return self::$config[$name][$group] ?? null;
|
||
}
|
||
|
||
/**
|
||
* Переопределяет раздел конфига в runtime.
|
||
*
|
||
* @param string $name Имя раздела
|
||
* @param mixed $value Значение
|
||
* @return void
|
||
*/
|
||
public static function set(string $name, mixed $value): void
|
||
{
|
||
self::load();
|
||
self::$config[$name] = $value;
|
||
}
|
||
|
||
/**
|
||
* Глубокое слияние двух массивов конфигурации.
|
||
*
|
||
* @param array $base Базовый массив
|
||
* @param array $override Массив-переопределение
|
||
* @return array
|
||
*/
|
||
public static function merge(array $base, array $override): array
|
||
{
|
||
foreach ($override as $key => $value) {
|
||
if (is_array($value) && isset($base[$key]) && is_array($base[$key])) {
|
||
$base[$key] = self::merge($base[$key], $value);
|
||
} else {
|
||
$base[$key] = $value;
|
||
}
|
||
}
|
||
|
||
return $base;
|
||
}
|
||
}
|