PHP и YAML
По следам публикации: PHP, Meet YAML
Каждому PHP приложению необходим какой-либо тип конфигурации. Как минимум, это конфигурационные параметры для подключения к серверу баз данных. Один из способов - сохранение конфигурационных данных непосредственно в PHP файле, это сподручно и обеспечивает быстрое считывание.
Однако, когда что-то удобно для Вас, как для разработчика, это не всегда удобно для других. К примеру, системным администраторам или обычным пользователям часто требуется развернуть и сконфигурировать Ваше приложение, некоторые из них имеют (или вовсе не имеют) минимальные знания о PHP и вполне спокойно способны совершить ошибку, забыв поставить кавычку, точку с запятой или скобку.
Что такое YAML
Самый популярный конфигурационный формат для PHP приложений, только если мы не говорим о хранении всей конфигурации в базе данных, это INI и XML. Большинство из нас понимает эти форматы, но у каждого из них есть свои слабые стороны: INI невозможно представить в сложной иерархической форме, а XML не так прост в понимании и использовании, как INI.
В погоне за простотой и гибкостью, сообщество Ruby and Rails предлагает формат YAML (Yet Another Markup Language, произносится как "ямл" ("yaamel")), который включает в себя гибкость XML и простоту INI. Похоже, до создателей XML уже начинает доходить, что если программисты http://www.xmlsuck.com/ и создают http://www.yaml.org/, то, наверное, у XML формата и правда есть недостатки, не позволяющие ему быть действительно универсальным. (hb: взято из wiki)
Посмотрим сразу на комплексный пример счет-фактуры на YAML (последовательность элементов обозначается через тире, а ключевые пары, переменная и ее значение, разделяются двоеточием):
--- !clarkevans.com/^invoice
invoice: 34843
date : 2001-01-23
bill-to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to: *id001
product:
- sku : BL394D
quantity : 4
description : Basketball
price : 450.00
- sku : BL4438H
quantity : 1
description : Super Hoop
price : 2392.00
tax : 251.42
total: 4443.52
comments: >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.
На первый взгляд все очень лаконично, почти все понятно и нет практически никакой перегрузки лишней информацией (тэгами и т.п.). Вообще YAML позиционируют как формат для сериализации данных, хранения конфигураций, логов, интернет сообщений и фильтров. Если есть недопонимания, Вам помогут следующие ссылки:
сейчас же наша цель немного не та.Как заставить PHP понимать YAML
Пока поддержка YAML не встроена в PHP, но существует несколько решений этого упущения:
- Spyc - обычный PHP класс для поддержки YAML, есть версия как для PHP4, так и для PHP5. Быстро ставится, легко используется.
-
Pecl/syck - очень быстрый YAML парсер (написан на C), который портирован Алексеем Захлестиным из проекта Syck в PECL как PHP расширение (PHP extension). Последний релиз (0.9.2) требует не менее: PHP 5.2.1 и PEAR Installer 1.4.0. (.DLL PECL для Windows я не нашел, если есть острая необходимость, DLL придется компилировать самостоятельно).
Расширение содержит две функции:
- array syck_load(string str)
- string syck_dump(mixed data) - Horde/Yaml - PEAR пакет для парсинга YAML файлов в PHP массивы, и обратной "выгрузки" PHP массивов в YAML формат. Базируется на вышеназванном Spyc. Родной PHP парсер пока еще не полностью поддерживает всю спецификацию YAML, но если доступно Pecl/syck расширение, использует для парсинга его. Требования для версии 1.0.0 не менее: PHP 5.1.0 и PEAR Installer 1.4.0b1.
Таким образом, на сегодняшний момент, наиболее универсальной связкой PHP+YAML является последний пакет: Horde/Yaml.
Инсталлируем Horde/Yaml
Если у Вас настроен и установлен PEAR и есть доступ в интернет, можно воспользоваться его "магическими" командами:
pear install horde/yaml
а нет, так можно просто скачать пакет Horde/Yaml, разархивировать его, и скопировать все содержимое директории Horde в доступную папку, указанную в include_path вашего PHP.
Используем Yaml
Вот простейший пример использования Horde/Yaml:
<?php
function sample_autoloader($class) {
require str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('sample_autoloader');
$a = Horde_Yaml::load("foo: bar
baz: qux");
var_export($a);
echo "
";
echo Horde_Yaml::dump($a);
?>
А это его результат:
'foo' => 'bar',
'baz' => 'qux',
)
---
foo: bar
baz: qux
Кроме вышеисполненных методов у Horde/Yaml есть еще два метода:
- loadFile(filename) - загружает Yaml содержимое из файла и
- loadStream(stream) - загружает Yaml содержимое из потока
На этом все, удачи, в освоении и применении Yaml!
Одна из не многих толковый статей в нете об этом
Статья оказалась, как никогда, кстати. Как раз собираюсь писать что-то среднее между скаффолдингом и ORM’ом для своего проекта. Спасибо автору!
пасиб! очень лаконично, полезно и вовремя. Респект.
Спасибо! Статья очень пригодилась. Правда не в php, а в ruby.
Есть еще класс Zend_Config_Yaml во многими любимом Zend Framework. Правда там только Yaml-декодинг.