yaml component for symfony2

.. index::
   single: YAML
   single: Configuration; YAML

YAML
====

`YAML`_ website is "a human friendly data serialization standard for all
programming languages". YAML is a simple language that describes data. As PHP,
it has a syntax for simple types like strings, booleans, floats, or integers.
But unlike PHP, it makes a difference between arrays (sequences) and hashes
(mappings).

The Symfony2 :namespace:`Symfony\\Component\\Yaml` Component knows how to
parse YAML and dump a PHP array to YAML.

.. note::

    Even if the YAML format can describe complex nested data structure, this
    chapter only describes the minimum set of features needed to use YAML as a
    configuration file format.

Reading YAML Files
------------------

The :method:`Symfony\\Component\\Yaml\\Parser::parse` method parses a YAML
string and converts it to a PHP array::

    use Symfony\Component\Yaml\Parser;

    $yaml = new Parser();
    $value = $yaml->parse(file_get_contents('/path/to/file.yaml'));

If an error occurs during parsing, the parser throws an exception indicating
the error type and the line in the original YAML string where the error
occurred::

    try {
        $value = $yaml->parse(file_get_contents('/path/to/file.yaml'));
    } catch (\InvalidArgumentException $e) {
        // an error occurred during parsing
        echo "Unable to parse the YAML string: ".$e->getMessage();
    }

.. tip::

    As the parser is reentrant, you can use the same parser object to load
    different YAML strings.

When loading a YAML file, it is sometimes better to use the
:method:`Symfony\\Component\\Yaml\\Yaml::load` wrapper method::

    use Symfony\Component\Yaml\Yaml;

    $loader = Yaml::load('/path/to/file.yml');

The ``Yaml::load()`` static method takes a YAML string or a file containing
YAML. Internally, it calls the ``Parser::parse()`` method, but with some added
bonuses:

* It executes the YAML file as if it was a PHP file, so that you can embed
  PHP commands in YAML files;

* When a file cannot be parsed, it automatically adds the file name to the
  error message, simplifying debugging when your application is loading
  several YAML files.

Writing YAML Files
------------------

The :method:`Symfony\\Component\\Yaml\\Dumper::dump` method dumps any PHP array
to its YAML representation::

    use Symfony\Component\Yaml\Dumper;

    $array = array('foo' => 'bar', 'bar' => array('foo' => 'bar', 'bar' => 'baz'));

    $dumper = new Dumper();
    $yaml = $dumper->dump($array);
    file_put_contents('/path/to/file.yaml', $yaml);

.. note::

    There are some limitations: the dumper is not able to dump resources and
    dumping PHP objects is considered an alpha feature.

If you only need to dump one array, you can use the
:method:`Symfony\\Component\\Yaml\\Yaml::dump` static method shortcut::

    $yaml = Yaml::dump($array, $inline);

The YAML format supports the two YAML array representations. By default, the
dumper uses the inline representation:

.. code-block:: yaml

    { foo: bar, bar: { foo: bar, bar: baz } }

But the second argument of the ``dump()`` method customizes the level at which
the output switches from the expanded representation to the inline one::

    echo $dumper->dump($array, 1);

.. code-block:: yaml

    foo: bar
    bar: { foo: bar, bar: baz }

.. code-block:: php

    echo $dumper->dump($array, 2);

.. code-block:: yaml

    foo: bar
    bar:
        foo: bar
        bar: baz

The YAML Syntax
---------------

Strings
~~~~~~~

.. code-block:: yaml

    A string in YAML

.. code-block:: yaml

    'A singled-quoted string in YAML'

.. tip::
   In a single quoted string, a single quote ``'`` must be doubled:

   .. code-block:: yaml

        'A single quote '' in a single-quoted string'

.. code-block:: yaml

    "A double-quoted string in YAML\n"

Quoted styles are useful when a string starts or ends with one or more relevant
spaces.

.. tip::

    The double-quoted style provides a way to express arbitrary strings, by
    using ``\`` escape sequences. It is very useful when you need to embed a
    ``\n`` or a unicode character in a string.

When a string contains line breaks, you can use the literal style, indicated
by the pipe (``|``), to indicate that the string will span several lines. In
literals, newlines are preserved:

.. code-block:: yaml

    |
      \/ /| |\/| |
      / / | |  | |__

Alternatively, strings can be written with the folded style, denoted by ``>``,
where each line break is replaced by a space:

.. code-block:: yaml

    >
      This is a very long sentence
      that spans several lines in the YAML
      but which will be rendered as a string
      without carriage returns.

.. note::

    Notice the two spaces before each line in the previous examples. They won't
    appear in the resulting PHP strings.

Numbers
~~~~~~~

.. code-block:: yaml

    # an integer
    12

.. code-block:: yaml

    # an octal
    014

.. code-block:: yaml

    # an hexadecimal
    0xC

.. code-block:: yaml

    # a float
    13.4

.. code-block:: yaml

    # an exponential number
    1.2e+34

.. code-block:: yaml

    # infinity
    .inf

Nulls
~~~~~

Nulls in YAML can be expressed with ``null`` or ``~``.

Booleans
~~~~~~~~

Booleans in YAML are expressed with ``true`` and ``false``.

Dates
~~~~~

YAML uses the ISO-8601 standard to express dates:

.. code-block:: yaml

    2001-12-14t21:59:43.10-05:00

.. code-block:: yaml

    # simple date
    2002-12-14

Collections
~~~~~~~~~~~

A YAML file is rarely used to describe a simple scalar. Most of the time, it
describes a collection. A collection can be a sequence or a mapping of
elements. Both sequences and mappings are converted to PHP arrays.

Sequences use a dash followed by a space (``-`` ):

.. code-block:: yaml

    - PHP
    - Perl
    - Python

The previous YAML file is equivalent to the following PHP code::

    array('PHP', 'Perl', 'Python');

Mappings use a colon followed by a space (``:`` ) to mark each key/value pair:

.. code-block:: yaml

    PHP: 5.2
    MySQL: 5.1
    Apache: 2.2.20

which is equivalent to this PHP code::

    array('PHP' => 5.2, 'MySQL' => 5.1, 'Apache' => '2.2.20');

.. note::

    In a mapping, a key can be any valid scalar.

The number of spaces between the colon and the value does not matter:

.. code-block:: yaml

    PHP:    5.2
    MySQL:  5.1
    Apache: 2.2.20

YAML uses indentation with one or more spaces to describe nested collections:

.. code-block:: yaml

    "symfony 1.4":
        PHP:      5.2
        Doctrine: 1.2
    "Symfony2":
        PHP:      5.3
        Doctrine: 2.0

The following YAML is equivalent to the following PHP code::

    array(
        'symfony 1.4' => array(
            'PHP'      => 5.2,
            'Doctrine' => 1.2,
        ),
        'Symfony2' => array(
            'PHP'      => 5.3,
            'Doctrine' => 2.0,
        ),
    );

There is one important thing you need to remember when using indentation in a
YAML file: *Indentation must be done with one or more spaces, but never with
tabulations*.

You can nest sequences and mappings as you like:

.. code-block:: yaml

    'Chapter 1':
        - Introduction
        - Event Types
    'Chapter 2':
        - Introduction
        - Helpers

YAML can also use flow styles for collections, using explicit indicators
rather than indentation to denote scope.

A sequence can be written as a comma separated list within square brackets
(``[]``):

.. code-block:: yaml

    [PHP, Perl, Python]

A mapping can be written as a comma separated list of key/values within curly
braces (``{}``):

.. code-block:: yaml

    { PHP: 5.2, MySQL: 5.1, Apache: 2.2.20 }

You can mix and match styles to achieve a better readability:

.. code-block:: yaml

    'Chapter 1': [Introduction, Event Types]
    'Chapter 2': [Introduction, Helpers]

.. code-block:: yaml

    "symfony 1.4": { PHP: 5.2, Doctrine: 1.2 }
    "Symfony2":    { PHP: 5.3, Doctrine: 2.0 }

Comments
~~~~~~~~

Comments can be added in YAML by prefixing them with a hash mark (``#``):

.. code-block:: yaml

    # Comment on a line
    "Symfony2": { PHP: 5.3, Doctrine: 2.0 } # Comment at the end of a line

.. note::

    Comments are simply ignored by the YAML parser and do not need to be
    indented according to the current level of nesting in a collection.

Dynamic YAML files
~~~~~~~~~~~~~~~~~~

In Symfony2, a YAML file can contain PHP code that is evaluated just before the
parsing occurs:

.. code-block:: yaml

    1.0:
        version: <?php echo file_get_contents('1.0/VERSION')."\n" ?>
    1.1:
        version: "<?php echo file_get_contents('1.1/VERSION') ?>"

Be careful to not mess up with the indentation. Keep in mind the following
simple tips when adding PHP code to a YAML file:

* The ``<?php ?>`` statements must always start the line or be embedded in a
  value.

* If a ``<?php ?>`` statement ends a line, you need to explicitly output a new
  line ("\n").

.. _YAML: http://yaml.org/


转载于:https://my.oschina.net/imot/blog/213455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值