Contributed by
Guilhem Niot
in #21194.

YAML格式 因为简单、可读性强而被接受,但在底层,它也为复杂需求定义了许多高级功能。其中之一是 YAML tags,主要用于定义显式的数据类型。

Symfony Yaml组件 已经支持了若干种标签,像是存储二进制数据的 !!binary 以及引用PHP常量的 !php/const:。在Symfony 3.3中你可以 定义你自己的YAML标签,这得益于被称之为 Yaml::PARSE_CUSTOM_TAGS 的全新旗标(flag)。

自定义标签可以是以 ! 字符开始的任意字符串,比如下例中的 !my_tag 值:

1
!my_tag { foo: bar }

使用下面的PHP代码来解析之:

1
2
3
4
5
6
7
8
use Symfony\Component\Yaml\Yaml;
 
$yaml = "!my_tag { foo: bar }";
$config = Yaml::parse($yaml, Yaml::PARSE_CUSTOM_TAGS);
 
 
$tag = $config->getTag();     // $tag = 'my_tag'
$value = $config->getValue(); // $value = array('foo' => 'bar')

YAML tags的语义取决于每一个程序,因此解析器把那些值打包成一个通用的 Symfony\Component\Yaml\Tag\TaggedValue 类。上例中, $config 变量现在包含:

1
TaggedValue('my_tag', array('foo' => 'bar'));

对YAML标签的支持,可以是以上两种方式。因此如果你的PHP代码中包含了 TaggedValue 对象,它们将被转换成YAML标签:

1
2
3
4
5
6
7
8
$config = array(
    new TaggedValue('foo', array('bar')),
    new TaggedValue('quz', array('baz')),
);
 
// The generated YAML code is / 生成的YAML代码是 :
// - !foo [bar]
// - !quz [baz]