Формат YAML
Дата обновления перевода 2025-08-05
Формат YAML
Компонент Symfony Yaml реализует избранное подмножество функций, определенных в спецификации YAML версии 1.2.
Скаляры
Синтаксис скаляров аналогичен синтаксису PHP.
Строки
Строки в YAML могут быть заключены как в одинарные, так и в двойные кавычки. В некоторых случаях они также могут быть без кавычек:
1 2 3 4 5
Строка в YAML
'Строка в YAML с одинарными кавычками'
" Строка в YAML с двойными кавычками"
Стили с кавычками полезны, когда строка начинается или заканчивается одним или несколькими соответствующими пробелами, потому что строки без кавычек обрезаются с обоих концов при анализе их содержимого содержимого. Кавычки требуются, если строка содержит специальные или зарезервированные символы.
При использовании строк с одинарными кавычками, любая одинарная кавычка ' внутри ее содержимого
должна быть удвоена, чтобы экранировать ее:
1
'Одинарные кавычку '' внутри строки с одинарными кавычками'
Строки, содержащие любой из следующих символов, должны быть заключены в кавычки:
: { } [ ] , & * # ? | - < > = ! % @ Хотя вы можете использовать двойные кавычки, для
этих символов удобнее использовать одинарные кавычки, что позволяет избежать необходимости
экранирования обратного слеша \.
Стиль двойных кавычек предоставляет возможность выражать произвольные строки, используя \
для экранирования символов и последовательностей. Например, он очень полезен
когда нужно вставить в строку символ \n или символ Unicode.
1
"Строка с двойными кавычками в YAML\n"
Если строка содержит любой из следующих управляющих символов, он должен быть экранирован двойными кавычками:
\0, \x01, \x02, \x03, \x04, \x05, \x06, \a,
\b, \t, \n, \v, \f, \r, \x0e, \x0f, \x10,
\x11, \x12, \x13, \x14, \x15, \x16, \x17, \x18,
\x19, \x1a, \e, \x1c, \x1d, \x1e, \x1f, \N,
\_, \L, \P
Наконец, есть и другие случаи, когда строки должны быть заключены в кавычки, независимо от того. используете ли вы одинарные или двойные кавычки:
- Когда строка имеет значение
true'' илиfalse`` (в противном случае она будет рассматриваться как булево значение); - Когда строка является
nullили~(в противном случае она будет рассматриваться как значениеnull); - Когда строка выглядит как число, например, целые числа (например,
2,14и т. д.), плавающие (например,2.6,14.9) и экспоненциальные числа (например,12e7и т. д.) (в противном случае она будет рассматриваться как числовое значение); - Если строка выглядит как дата (например,
2014-12-31) (в противном случае она будет автоматически преобразуется во временную метку Unix).
Если строка содержит разрывы строк, вы можете использовать литеральный стиль, обозначенный
символом трубы (|), чтобы указать, что строка будет охватывать несколько строк. В
литералах новые строки сохраняются:
1 2 3
|
\/ /| |\/| |
/ / | | | |__
Кроме того, строки можно записывать в свернутом стиле, обозначаемом >,
где каждый разрыв строки заменяется пробелом:
1 2 3 4 5 6 7 8 9 10 11 12 13
>
Это очень длинное предложение
которое занимает несколько строк в YAML.
# Это будет проанализировано следующим образом: (обратите внимание на \n)
# "Это очень длинное предложение, которое занимает несколько строк в YAML.\n"
>-
Это очень длинное предложение
которое занимает несколько строк в YAML.
# Это будет проанализировано следующим образом: (обратите внимание на \n)
# "Это очень длинное предложение, которое занимает несколько строк в YAML.\n"
Note
Обратите внимание на два пробела перед каждой строкой в предыдущих примерах. Они не появятся в результирующих строках PHP.
Числа
1 2
# целое число
12
1 2
# восьмеричное число
0o14
1 2
# шестнадцатиричное число
0xC
1 2
# плавающее число
13.4
1 2
# экспоненциальное число
1.2e+34
1 2
# бесконечность
.inf
Нули
Нули в YAML можно выразить с помощью null или ~.
Булевые значения
Булевые значения в YAML выражаются с помощью true и false.
Коллекции
YAML-файл редко используется для описания простого скаляра. Чаще всего он описывает коллекцию. Коллекции YAML могут быть последовательностью (индексированные массивы в PHP) или отображением элементов (ассоциативные массивы в PHP).
В последовательностях используется тире, за которым следует пробел:
1 2 3
- PHP
- Perl
- Python
Предыдущий YAML-файл эквивалентен следующему PHP-коду:
1
['PHP', 'Perl', 'Python'];
В сопоставлениях для обозначения каждой пары ключ/значение используется двоеточие, за которым следует пробел (:):
1 2 3
PHP: 5.2
MySQL: 5.1
Apache: 2.2.20
что эквивалентно этому PHP-коду:
1
['PHP' => 5.2, 'MySQL' => 5.1, 'Apache' => '2.2.20'];
Note
В отображении ключ может быть любым валидным скаляром.
Количество пробелов между двоеточием и значением не имеет значения:
1 2 3
PHP: 5.2
MySQL: 5.1
Apache: 2.2.20
В YAML используются отступы с одним или несколькими пробелами для описания вложенных коллекций:
1 2 3 4 5 6
'symfony 1.0':
PHP: 5.0
Propel: 1.2
'symfony 1.2':
PHP: 5.2
Propel: 1.3
Приведенный выше YAML эквивалентен следующему PHP-коду:
1 2 3 4 5 6 7 8 9 10
[
'symfony 1.0' => [
'PHP' => 5.0,
'Propel' => 1.2,
],
'symfony 1.2' => [
'PHP' => 5.2,
'Propel' => 1.3,
],
];
Есть одна важная вещь, которую нужно помнить при использовании отступов в YAML-файле: Отступы должны быть сделаны с помощью одного или нескольких пробелов, но никогда с помощью табуляции.
Вы можете вложить последовательности и сопоставления как угодно:
1 2 3 4 5 6
'Chapter 1':
- Introduction
- Event Types
'Chapter 2':
- Introduction
- Helpers
YAML также может использовать стили потока для коллекций, используя явные индикаторы, а не отступы для обозначения области видимости.
Последовательность может быть записана в виде списка, разделенного запятыми и заключенного в квадратные скобки
([]):
1
[PHP, Perl, Python]
Отображение может быть записано в виде списка ключей/значений, разделенных запятыми и заключенных в фигурные
скобки ({}):
1
{ PHP: 5.2, MySQL: 5.1, Apache: 2.2.20 }
Вы можете смешивать и сочетать стили, чтобы добиться лучшей читабельности:
1 2
'Chapter 1': [Introduction, Event Types]
'Chapter 2': [Introduction, Helpers]
1 2
'symfony 1.0': { PHP: 5.0, Propel: 1.2 }
'symfony 1.2': { PHP: 5.2, Propel: 1.3 }
Комментарии
Комментарии можно добавлять в YAML, добавляя к ним префикс в виде хеш-знака (#):
1 2 3
# Комментарий в строке
"symfony 1.0": { PHP: 5.0, Propel: 1.2 } # Прокомментировать в конце строки
"symfony 1.2": { PHP: 5.2, Propel: 1.3 }
Note
Комментарии игнорируются парсером YAML и не нуждаются в отступах в соответствии с текущим уровнем вложенности коллекции.
Явная типизация
Спецификация YAML определяет некоторые теги для явного задания типа любых данных:
1 2 3 4 5 6 7 8 9 10 11 12 13
data:
# это значение анализируется как строка (не преобразуется в DateTime)
start_date: !!str 2002-12-14
# это значение анализируется как плавающее число (будет 3.0 вместо 3)
price: !!float 3
# это значение анализируется как бинарные данные, зашифрованные в base64
picture: !!binary |
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=
Сепциальные функции Symfony
Компонент Yaml предоставляет некоторые дополнительные функции, которые не являются частью официальной спецификации YAML, но полезны в приложениях Symfony:
!php/constпозволяет получить значение PHP-константы. Этот тег принимает полное имя класса константы в качестве аргумента:1 2
data: page_limit: !php/const App\Pagination\Paginator::PAGE_LIMIT!php/objectпозволяет передать сериализованное представление PHP-объекта (созданного с помощью функции serialize()), который будет десериализован при анализе YAML-файла:1 2
data: my_object: !php/object 'O:8:"stdClass":1:{s:3:"bar";i:2;}'!php/enumпозволяет использовать регистр PHP enum. Этот тег принимает имя класса регистра исчисления в качестве аргумента:1 2 3 4 5
data: # Вы можете использовать типизированный случай enum... operator_type: !php/enum App\Operator\Enum\Type::Or # ... или вы также можете использовать "->value" напрямую, используя значение случая BackedEnum operator_type: !php/enum App\Operator\Enum\Type::Or->valueЭтот тег позволяет опустить случай исчисления и предоставить только исчисление FQCN, чтобы вернуть массив всех доступных исчислений:
1 2
data: operator_types: !php/enum App\Operator\Enum\Type7.1
Поддержка использования исчисления FQCN без указания случая была введена в Symfony 7.
Неподдерживаемые функци YAML
Компонент Symfony Yaml не поддерживает следующие функции YAML:
- Мультидокументы (маркеры
---и...); - Сложные ключи отображения и сложные значения, начинающиеся с
?; - Тегированные значения в качестве ключей;
- Следующие теги и типы:
!!set,!!omap,!!pairs,!!seq,!!bool,!!int,!!merge,!!null,!!timestamp,!!value,!!yaml; - Теги (директива
TAG; пример:%TAG ! tag:example.com,2000:app/) и ссылки на теги (пример:!<tag:example.com,2000:app/foo>); - Использование синтаксиса, похожего на последовательность, для отображения элементов (пример:
{foo, bar}; используйте{foo: ~, bar: ~}вместо этого).