Работа с YAML в PHP: библиотека Symfony Yaml и парсинг данных

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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' => 'значение', '                    

Рекомендаций