Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Moguta.CMS – вторая версия || Хостинг для интернет магазина >>>

Формат YAML и его parser на PHP

07.11.2012
Формат YAML  и его parser на PHP

Здравствуйте, уважаемые читатели блога LifeExample, в этой статье я хочу рассказать вам о формате YAML, целью которого является компактное хранение настроек web-проекта, а также предложить YAML парсер, для использования этого формата.

Из расшифровки аббревиатуры YAML (Yet Another Markup Language) можно сложить представление, что мы имеем дело с очередным языком программирования, на самом же деле, под аббревиатурой YAML понимают особый текстовый формат для описания структур данных.

Формат YAML – это еще один текстовый формат для сериализации информации, по смыслу похожий на XML и JSON. Также как и другие аналоги, YAML имеет свой собственный синтаксис, для описания данных, и синтаксис этот покорил сердца многих разработчиков своей простотой.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Объект_1:
 Подобъект_строка: "обычная строка"
 Подобъект_массив:
   - элемент_1
   - элемент_2
 Очень_длинное_значение: >
   Много-много-много-много-много-много-много-много-много букаф
   Букаф много, не влезают в одну строку
   Много-много-много-много-много-много-много-много-много букаф
 Подобъект_ассоц_массив: { id: 1, name: "" }
Объект_2:
 Подобъект_1: 5978
   Под-подобъект 1: false
Объект_3: "простой текст в одну строку"
 Подобъект_1: true
 Подобъект_2: |
   Много
   строчный текст
   с сохранением переносов строк
 Подпункт_массив: [1, 2, 3]
#Комментарий, который игнорируется
Изображение: !!binary |
iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAIAAAAmdTLBAAAAAXNSR0IArs4c6QAAAARnQU1B
AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA

В представленной разметке YAML можно увидеть часто используемые примеры описания таких данных как:

  • Массивы: простые и ассоциативные
  • Булевы значения true и false (также можно записать как on/of или 1/0)
  • Текст в одну строку
  • Многострочный текст
  • Цифры
  • Древовидный объект
  • Изображение или любой бинарный файл

Вложенность данных определяется количеством начальных пробелов в строке. Формат YAML запрещает использование табуляции вместо пробелов, поэтому стоит быть внимательным и отделять вложенные подпункты двумя пробелами.

Для чего нужен YAML

Удобный для восприятия человеком формат YAML, в первую очередь предназначается для хранения настроек проекта, и является альтернативой для файлов с расширением INI.

Например, с помощью Yaml конструкций можно создать ленту новостей, и впоследствии оперативно ее изменять вручную.

На практике мне пришлось применить данный формат для задания настроек шаблонов e-mail рассылок:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
##
# Шаблон по умолчанию
##
default:
  type: text/plain  
  template_1:
    header: "Приветствую Вас уважаемый читатель блога lifeexample.ru"
    subj: "Информация с сайта lifeexample"
    footer: "Ознакомиться со всеми материалами можно на сайте lifeexample.ru"
    subcribe: "С уважением Авдеев Марк"


##
# Почтовый шаблон для рассылки новостей
##
news:
  type: text/html
  template_1:
    header: '<h1>[title]<h1>'
    subj: "Новостная рассылка"
    footer: '<div style="color:green">[footer]<div>'
    subcribe: |
      '<div style="color:red">
        <em>
          [subcribe]
        <em>
       <div>'

Как видите из представленной структуры, видно, что я задал два вида шаблона, простой текстовый формат письма, и шаблон для рассылки новостей с html оформлением. Каждая из структур описывает параметры того или иного шаблона, задавая заголовок письма, визуальное оформление и подпись.

Достав эти настройки из файла, и склеив их воедино, предварительно заменив маркеры [title], [footer] и [subscribe] на текстовые переменные, можно получить красивый шаблон для отправки текста адресату.

Познакомившись с примерами описания разных типов данных, в формате YAML, перейдем к работе с ними.

YAML parser

При наличии определенной структуры в формате YAML , нам необходимо иметь инструмент, для работы с этими настройками. Как правило, таким инструментом является собственноручно написанный парсер YAML файлов, но для языка PHP уже есть ряд разработанных парсеров от известных библиотеках, таких как: SPYC, PECL, Symfony и др.

Сегодня я не намерен изобретать велосипед, и хочу взять за основу проверенный парсер от Symfony.

В отдельности от Symfony , он не предоставляется, поэтому придется покопаться в классах этого фреймворка и взять лишь нужные нам.

классы symfony для yaml parser

Объединив их не сложной логической связью и быстренько дописав интерфейс для работы с методами этих классов, я получил простой в использовании YAML parser, который работает абсолютно автономно, и на любом проекте.

Скачать парсер YAML ( Скачали: 688 чел. ) 

Как использовать YAML parser

В архиве находится два файла для демонстрации и директория с самим парсером.

YAML parser

Распакуйте содержимое архива в любую удобную директорию.

Для демонстрации работы парсера запустите файл index.php , в котором должно находиться такое содержание:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
//подключить Yaml parser
require_once('parserYaml/parserYaml.php');

//получить текст в yaml формате
$yaml = file_get_contents('template.yaml');

//создать объект для работы с файлом
$parser = new YamlToArray();

//конвертирование данных в массив
$data = $parser->fileParseToArray($yaml);

//просто вывести на экран представление Yaml файла в виде массива
$parser->printYamlAsArray($yaml);

Как видите в использовании, получившийся YAML parser очень прост, сначала подключается класс обертки, который содержит два метода.

  • fileParseToArray() – конвертирует строку в формате YAML в массив и возвращает его, для дальнейшей работы.
  • printYamlAsArray() – конвертирует строку в формате YAML в массив и выводит его на экран, для визуального анализа.

Затем создается объект для работы с парсером и вызываются два выше описанных метода, демонстрируя работу инструмента.

Теперь, имея в арсенале такой YAML parser, можно не затрудняясь использовать сложные конструкции в конфигурационных файлах формата YAML.

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Дiмка

    Привет! Интересная статья!
    Только не понятно, чем данный формат лучше допустим:
    — ini, своей простотой? Для работы с ним вообще не чего не надо подключать, считывай на здоровье данные в массив.
    — json, мультиязычностью? возможностью обмениваться данными между разными языками программирования(js например)
    — xml, расширяемостью? благодаря атрибутам возможно добавлять данным дополнительные свойства, например их тип

    • В отличии от INI на YAML можно описать сложные структуры, с многочисленными вложениями, и указанием типов. В ini вложенность не поддерживается.

    • Дiмка

      Да, поддержка типов данных это хорошо. Ты в статье не упомянул об этом.

  • Саша

    json — частичный вариант yaml, строковый вариант его записи.
    xml — он более «многословный».
    ini — простой как дерево (это плюс) но не годится для сохранения сложных структур (это минус).

    По сути yaml ближе всего по возможностям к xml. Но, в отличии о последнего, более компактный, позволяет писать более свободно. В xml нужно беспокоится о открытии, закрытии тэгов, об угловых скобках. Можно сказать так — xml хорош для машинного разбора и формирования; yaml хорош для написания, правки человеком.

    Я для себя использую yaml для хранения конфигураций. Простота редактирования, как в ini и «описательные» возможности, как в xml.

    • bammbr

      А кто сказал, что «заботиться о закрытии тегов» — это плохо??? Как раз-таки, чёткое обозначение вложенности видимыми символами. А не невидимыми пробелами. А если у тебя структура на на три экрана? Бегать вверх-вниз, пробельчики считать?

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика