Неизменяемая конфигурация для PHP 8.1+ с доступом по точечному ключу и загрузкой из JSON/XML/YAML/NEON через безопасные парсеры cloud-castle.

Maintainers

Package info

gitverse.ru/cloud-castle/config

Homepage

Issues

Documentation

pkg:composer/cloud-castle/config

Transparency log

Statistics

Installs: 10

Dependents: 4

Suggesters: 0

v1.0.3 2026-07-24 10:34 UTC

This package is auto-updated.

Last update: 2026-07-29 09:11:27 UTC


README

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano

CloudCastle Config

CloudCastle Config

Packagist Version Downloads PHP Version License

Неизменяемая конфигурация для PHP 8.1+ с доступом по точечному ключу (db.connections.default) и загрузкой из JSON/XML/YAML/NEON через безопасные парсеры cloud-castle/parser-* (fail-loud, только данные, без выполнения кода). Рекурсивное слияние источников, require() для обязательных ключей, исключения без раскрытия значений.

Установка

composer require cloud-castle/config

Требуется PHP 8.1+.

Быстрый старт

<?php

use CloudCastle\Config\Config;
use CloudCastle\Config\ConfigLoader;

// Доступ по точечному ключу.
$config = new Config([
    'app' => ['name' => 'Demo', 'debug' => true],
    'db' => ['host' => 'localhost', 'port' => 5432],
]);

$config->get('db.host');            // 'localhost'
$config->get('db.timeout', 30);     // 30 (значение по умолчанию)
$config->has('app.debug');          // true
$config->require('db.port');        // 5432 (исключение, если ключа нет)

// Неизменяемость: with()/merge() возвращают новый экземпляр.
$prod = $config
    ->with('app.debug', false)
    ->merge(['db' => ['port' => 6432]]); // рекурсивное слияние, host сохраняется

// Загрузка из файлов (формат по расширению, безопасный разбор).
$fromFile = ConfigLoader::fromFile('/etc/app/database.yaml');
$merged = ConfigLoader::fromDirectory('/etc/app/config'); // все файлы → ветви по имени

Возможности

  • Точечный доступ: get(), require() (fail-loud), has() по ключам вида db.connections.default.
  • Неизменяемость: with() и merge() возвращают новый экземпляр — общий конфиг нельзя случайно изменить.
  • Загрузка из файлов: ConfigLoader::fromFile() и fromDirectory() — формат определяется по расширению (json/xml/yaml/yml/neon).
  • Безопасный разбор: файлы читают парсеры cloud-castle/parser-* — только данные, без выполнения кода, объектов и XXE.
  • Рекурсивное слияние: merge() объединяет отображения по ключам, списки заменяет целиком.
  • Исключения не раскрывают значения — в сообщении только имя ключа/причина.

Сравнение с аналогами

Все таблицы ниже сгенерированы автоматически из честных сравнительных тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов, PHP 8.1.34, без Xdebug.

1. Функциональность

Возможность🏆 CloudCastleadbariodflydevilluminateselectivesymfony
Доступ по точечному ключу (db.port)
Неизменяемость (модификаторы возвращают новый экземпляр)
Загрузка из файлов JSON/XML/YAML/NEON
Безопасный разбор файлов (без выполнения кода и инъекций)
Рекурсивное слияние источников
Всего🏆 522120

2. Безопасность и корректность

Свойство🏆 CloudCastleadbariodflydevilluminateselectivesymfony
Безопасный разбор конфигов (нет выполнения кода при загрузке)
Отклонение опасных конструкций (XXE, объекты в YAML/NEON)
Fail-loud на отсутствующем обязательном ключе
Неизменяемость (нет случайной мутации общего конфига)
Исключения не раскрывают значения (только имя ключа)
Всего🏆 500021

3. Производительность

обёртка конфигурации + чтение двух вложенных значений, 100 000 раз (минимум из 4).

РешениеВремя (мс)Итог
🏆 CloudCastle1 637,1быстрейшее среди библиотек
selective2 111,4аналог
dflydev2 885,5аналог
adbario4 384,1аналог
symfony5 620,9аналог
illuminate6 751,6аналог

4. Потребление памяти

Инкрементальный пик при удержании 100 000 результатов (изолированный процесс).

РешениеПиковая память (KB)Итог
🏆 symfony4 100легчайшее среди библиотек
CloudCastle10 602аналог
selective10 608аналог
illuminate10 611аналог
dflydev10 618аналог
adbario12 982аналог

Коротко

Неизменяемый доступ к конфигурации по точечному ключу с безопасной загрузкой из файлов (JSON/XML/YAML/NEON) и рекурсивным слиянием — то, чего нет у чистых dot-контейнеров. Лидирует по функционалу, безопасности и скорости; по памяти — легчайший среди реальных config-контейнеров (тоньше illuminate/adbario), а меньший расход только у symfony/property-access — но это stateless-аксессор без контейнера, загрузки и слияния (нулевой функционал по нашей матрице).

Плюсы, минусы и когда применять

Сильные стороны:

  • Функционал = объединение аналогов — точечный доступ + неизменяемость + загрузка JSON/XML/YAML/NEON + безопасный разбор + слияние источников; у аналогов — лишь часть из этого.
  • Безопасность — разбор файлов без выполнения кода, отклонение XXE/опасных конструкций, fail-loud на отсутствующем обязательном ключе, исключения не раскрывают значения (лидер по таблице безопасности).
  • Производительностьбыстрейшее точечное чтение среди аналогов (isset-путь без лишних вызовов функций), опережает selective, dflydev, adbario и illuminate.
  • Неизменяемость — модификаторы возвращают новый экземпляр, общий конфиг не мутирует.
  • Память — легчайший среди реальных config-контейнеров (обёртка тоньше, чем у illuminate/adbario); замер удерживает сами объекты-обёртки, а не производную строку.

Слабые стороны (честно):

  • Память vs stateless-аксессорsymfony/property-access расходует ещё меньше, так как вообще не создаёт объект-контейнер (работает по вашему массиву); плата за это — отсутствие загрузки файлов, слияния, неизменяемости и безопасного разбора.
  • Экосистемаilluminate/config глубже интегрирован в Laravel (готовые провайдеры/фасады), здесь интеграцию с фреймворком нужно делать самостоятельно.
  • Не микропакет — если нужен только dot-доступ без загрузки файлов и слияния, узкий контейнер (adbario/dflydev) минималистичнее по объёму кода.

Когда применять. Там, где конфигурация приходит из файлов недоверенного/внешнего происхождения и важны безопасный разбор, предсказуемость, неизменяемость и слияние источников. Для сверхлёгкого dot-доступа без загрузки файлов подойдёт узкий контейнер (adbario/dflydev), для Laravel — illuminate/config.

Разработка

composer install
composer check    # линтеры + статический анализ + тесты
composer fix      # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci       # полный CI-пайплайн локально

Полный список команд с описаниями: composer run-script --list.

Документация

Лицензия

MIT © CloudCastle (alex-4-17@yandex.ru)

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano