расставляй правильно приоритеты и не отвлекайся на мелочи

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 channel-discover pear.horde.org
pear install horde/yaml

а нет, так можно просто скачать пакет Horde/Yaml, разархивировать его, и скопировать все содержимое директории Horde в доступную папку, указанную в include_path вашего PHP.

Используем Yaml

Вот простейший пример использования Horde/Yaml:

<?

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);

?>

А это его результат:

array (

  ‘foo’ => ‘bar’,

  ‘baz’ => ‘qux’,

)



foo: bar

baz: qux

Кроме вышеисполненных методов у Horde/Yaml есть еще два метода:
— loadFile(filename) — загружает Yaml содержимое из файла и
— loadStream(stream) — загружает Yaml содержимое из потока

На этом все, удачи, в освоении и применении Yaml!

5 комментариев на статью:
  1. keyser-sooze:

    Одна из не многих толковый статей в нете об этом

  2. Виталий:

    Статья оказалась, как никогда, кстати. Как раз собираюсь писать что-то среднее между скаффолдингом и ORM’ом для своего проекта. Спасибо автору!

  3. Евгений:

    пасиб! очень лаконично, полезно и вовремя. Респект.

  4. DevPulse:

    Спасибо! Статья очень пригодилась. Правда не в php, а в ruby.

  5. Anton:

    Есть еще класс Zend_Config_Yaml во многими любимом Zend Framework. Правда там только Yaml-декодинг.

Ответить
Обязательные поля помечены *