cloud-castle/parser-yaml

Безопасный разбор и сериализация блочного YAML для PHP 8.1+ без ext-yaml: только данные (нет тегов/якорей/объектов), fail-loud, двунаправленность. Нулевые зависимости.

Maintainers

Package info

gitverse.ru/cloud-castle/parser-yaml

Homepage

Issues

Documentation

pkg:composer/cloud-castle/parser-yaml

Transparency log

Statistics

Installs: 12

Dependents: 1

Suggesters: 1

v1.1.0 2026-07-22 10:16 UTC

This package is auto-updated.

Last update: 2026-07-29 09:12:02 UTC


README

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

CloudCastle Parser Yaml

CloudCastle Parser Yaml

Packagist Version Downloads PHP Version License

Безопасный разбор и сериализация блочного YAML для PHP 8.1+ без внешних расширений. Разбирает только данные: никаких тегов, якорей и инстанцирования объектов — это исключает YAML-инъекции и выполнение кода на недоверенном вводе. Fail-loud, исключения не раскрывают исходных данных. Ядро — на чистом PHP (лёгкие PSR-контракты нужны лишь для загрузки по URL).

Установка

composer require cloud-castle/parser-yaml

Требуется PHP 8.1+ (без расширения ext-yaml).

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

<?php

use CloudCastle\Parser\Yaml\Yaml;

// Разбор YAML в структуру PHP.
$config = Yaml::parse(<<<YAML
name: demo
debug: false
hosts:
  - a.local
  - b.local
database:
  driver: pgsql
  port: 5432
YAML);
// ['name' => 'demo', 'debug' => false, 'hosts' => ['a.local', 'b.local'], ...]

// Сериализация обратно в YAML.
$yaml = Yaml::dump(['app' => ['name' => 'demo', 'workers' => 4]]);

// Проверка без исключения.
if (Yaml::isValid($input)) {
    // ...
}

// Разбор из локального файла.
$config = Yaml::parseFile('/path/to/config.yaml');

// Автоопределение источника: локальный путь или URL. Загрузка по URL
// делегируется PSR-18 клиенту (лимит размера, таймауты и защита от SSRF —
// на стороне клиента, например cloud-castle/http-client).
$config = Yaml::parseFrom('https://example.com/config.yaml', $httpClient, $requestFactory);
$config = Yaml::parseFrom('/path/to/config.yaml'); // тот же метод — локальный файл

Возможности

  • Block YAML: отображения, списки, вложенность по отступам, типизированные скаляры (bool/null/int/float), одинарные и двойные кавычки, комментарии.
  • Только данные: разбор возвращает массивы и скаляры — никаких объектов, тегов (!!php/object) и якорей, то есть нет YAML-инъекций и выполнения кода.
  • Fail-loud: ошибка разбора или сериализации — исключение (ParseException/DumpException) с номером строки, а не тихий null/false.
  • Исключения не содержат исходных данных — только причину и номер строки, чтобы персональные данные из конфигурации не утекли в логи.
  • Двунаправленность: parse() (YAML → структура) и dump() (структура → YAML).
  • Загрузка из файла и по URL: parseFile() (локальный файл) и parseFrom() (автоопределение локального пути или URL). Сеть не встроена — загрузка по URL идёт через инъектируемый PSR-18 клиент, где и задаются лимит размера, таймауты и защита от SSRF (например, cloud-castle/http-client).
  • Разбор без внешних библиотек — ядро на чистом PHP, без ext-yaml; лёгкие PSR-контракты (PSR-18/17) нужны только для загрузки по URL.

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

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

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

Возможность🏆 CloudCastlesymfonyspycdallgootpreg¹
Разбор block YAML (отображения/списки/вложенность)
Типизированные скаляры (bool/null/int/float)
Разбор в чистые данные (массивы/скаляры, без объектов)
Fail-loud: исключение при ошибке разбора
Разбор ядром без внешних библиотек (PSR-контракты лишь для URL)
Загрузка из файла/URL с контролем размера и SSRF (PSR-18)
Всего🏆 64442

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

Свойство🏆 CloudCastlesymfonyspycdallgootpreg¹
Не создаёт PHP-объекты при разборе (только данные)
Нет тегов/якорей — нет YAML-инъекций и выполнения кода
Fail-loud: исключение вместо тихого null/false
Исключения не раскрывают исходные данные (нет утечки ПД)
Нет внешних включений/ссылок
Всего🏆 53323

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

разбор YAML-документа в структуру, 20 000 раз (минимум из 4).

РешениеВремя (мс)Итог
preg¹42,2базовый уровень (не библиотека)
🏆 CloudCastle1 033,6быстрейшее среди библиотек
spyc1 577,5аналог
symfony2 892,4аналог
dallgoot3 003,8аналог

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

Пик памяти на 20 000 операций (изолированный процесс, только целевая библиотека).

РешениеПиковая память (KB)Итог
🏆 CloudCastle7 108легчайшее среди библиотек
spyc7 108аналог
preg¹7 108базовый уровень (не библиотека)
symfony7 159аналог
dallgoot10 178аналог

¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.

Вывод: CloudCastle Parser Yaml — самый безопасный среди рассмотренных YAML-инструментов (только данные, без объектов/тегов/якорей и утечки данных в ошибках) и самый быстрый среди библиотек (быстрее symfony/yaml, spyc, dallgoot/yaml; наивный regex-разбор взят за базовый уровень). Это намеренное безопасное подмножество YAML для конфигураций: если нужны якоря, поточный стиль ([a, b]), многострочные блоки и полная спека YAML — берите symfony/yaml; если важна защита от инъекций, предсказуемость и нулевые зависимости при разборе недоверенных конфигов — этот пакет.

Разработка

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