Bicycle/System/Classes/Config.php
Egor Isaev b65603b4d0 dev
2026-06-23 10:44:18 +03:00

97 lines
2.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}