Работа с YAML в PHP: библиотека Symfony Yaml
YAML (YAML Ain't Markup Language) — это формат сериализации данных, который часто используется для конфигурационных файлов, описания структур данных и обмена информацией между сервисами. В PHP для работы с YAML существует несколько решений, но самым популярным и функциональным является компонент Symfony Yaml. Он предоставляет удобные методы для парсинга (чтения) и дампа (записи) YAML-данных, поддерживает все спецификации YAML 1.2 и встроен во многие фреймворки, включая Laravel и Symfony.
В этой статье мы подробно разберём установку, базовые операции и продвинутые возможности библиотеки Symfony Yaml. Вы узнаете, как преобразовывать YAML в массивы PHP и обратно, а также как обрабатывать сложные структуры.
Установка библиотеки
Symfony Yaml устанавливается через Composer. Выполните команду в корне вашего проекта:
composer require symfony/yaml
После установки подключите автозагрузчик Composer и импортируйте нужные классы:
require 'vendor/autoload.php';
use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Exception\ParseException;
Основные операции
Парсинг YAML-строки
Метод Yaml::parse() преобразует YAML-строку в массив PHP. Рассмотрим пример с простой конфигурацией:
$yamlString = "
database:
host: localhost
port: 3306
name: mydb
user: admin
password: secret
";
try {
$data = Yaml::parse($yamlString);
print_r($data);
} catch (ParseException $e) {
echo 'Ошибка парсинга YAML: ' . $e->getMessage();
}
Результат выполнения:
Array
(
[database] => Array
(
[host] => localhost
[port] => 3306
[name] => mydb
[user] => admin
[password] => secret
)
)
Парсинг YAML-файла
Чаще всего YAML хранится в файлах. Для их чтения используйте file_get_contents() вместе с парсером:
$yamlFile = __DIR__ . '/config.yaml';
if (!file_exists($yamlFile)) {
die('Файл конфигурации не найден');
}
try {
$config = Yaml::parse(file_get_contents($yamlFile));
echo 'Хост базы данных: ' . $config['database']['host'];
} catch (ParseException $e) {
echo 'Ошибка чтения файла: ' . $e->getMessage();
}
Дамп (запись) в YAML
Метод Yaml::dump() преобразует массив PHP обратно в YAML-строку. Это полезно для генерации конфигураций или экспорта данных:
$data = [
'app' => [
'name' => 'MyApp',
'version' => '1.0.0',
'debug' => true,
'modules' => ['auth', 'api', 'admin']
]
];
$yamlOutput = Yaml::dump($data, 3); // Второй параметр — уровень вложенности
file_put_contents('app_config.yaml', $yamlOutput);
echo $yamlOutput;
Результат в файле:
app:
name: MyApp
version: '1.0.0'
debug: true
modules:
- auth
- api
- admin
Продвинутые возможности
Обработка вложенных структур и специальных типов
Symfony Yaml поддерживает вложенность любой глубины, а также специальные типы данных, такие как даты, null и логические значения:
$complexYaml = "
server:
host: 192.168.1.1
ports:
- 80
- 443
- 8080
settings:
timeout: 30
enabled: true
description: ~
created_at: 2024-01-15
";
$parsed = Yaml::parse($complexYaml);
var_dump($parsed['server']['settings']['enabled']); // bool(true)
var_dump($parsed['server']['settings']['description']); // NULL
var_dump($parsed['server']['settings']['created_at']); // string(10) "2024-01-15"
Кастомные флаги парсинга
Метод parse() принимает второй аргумент — битовую маску флагов. Например, Yaml::PARSE_KEYS_AS_STRINGS гарантирует, что ключи будут строками:
$yaml = "1: значение\n2: другое\n";
$result = Yaml::parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS);
print_r($result); // ['1' => 'значение', '