Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Формат 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 , он не предоставляется, поэтому придется покопаться в классах этого фреймворка и взять лишь нужные нам.
Объединив их не сложной логической связью и быстренько дописав интерфейс для работы с методами этих классов, я получил простой в использовании 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 ленту блога.
Комментарии
Привет! Интересная статья!
Только не понятно, чем данный формат лучше допустим:
— ini, своей простотой? Для работы с ним вообще не чего не надо подключать, считывай на здоровье данные в массив.
— json, мультиязычностью? возможностью обмениваться данными между разными языками программирования(js например)
— xml, расширяемостью? благодаря атрибутам возможно добавлять данным дополнительные свойства, например их тип
В отличии от INI на YAML можно описать сложные структуры, с многочисленными вложениями, и указанием типов. В ini вложенность не поддерживается.
Да, поддержка типов данных это хорошо. Ты в статье не упомянул об этом.
json — частичный вариант yaml, строковый вариант его записи.
xml — он более «многословный».
ini — простой как дерево (это плюс) но не годится для сохранения сложных структур (это минус).
По сути yaml ближе всего по возможностям к xml. Но, в отличии о последнего, более компактный, позволяет писать более свободно. В xml нужно беспокоится о открытии, закрытии тэгов, об угловых скобках. Можно сказать так — xml хорош для машинного разбора и формирования; yaml хорош для написания, правки человеком.
Я для себя использую yaml для хранения конфигураций. Простота редактирования, как в ini и «описательные» возможности, как в xml.
А кто сказал, что «заботиться о закрытии тегов» — это плохо??? Как раз-таки, чёткое обозначение вложенности видимыми символами. А не невидимыми пробелами. А если у тебя структура на на три экрана? Бегать вверх-вниз, пробельчики считать?