Yaml组件
编辑本页Yaml组件
Yaml组件加载和转储Yaml文件。
这是什么?
Symf欧宝娱乐app下载地址ony Yaml组件解析Yaml字符串,将其转换为PHP数组。它还能够将PHP数组转换为YAML字符串。
YAML,YAML不是标记语言,是适用于所有编程语言的人类友好的数据序列化标准。YAML是配置文件的一种很好的格式。YAML文件和XML文件一样具有表现力,和INI文件一样具有可读性。
Symf欧宝娱乐app下载地址ony Yaml组件实现了定义在YAML 1.2版本规范.
提示
了解更多YAML的规范.
安装
1
$作曲家需要symfony/yaml欧宝娱乐app下载地址
请注意
如果在Symfony应用程序外部安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
为什么?
快
Symfony Yaml的目标之一是在速欧宝娱乐app下载地址度和功能之间找到正确的平衡。它只支持处理配置文件所需的特性。值得注意的是:文档指令、多行引用消息、紧凑块集合和多文档文件。
真正的解析器
它展示了一个真正的解析器,能够解析YAML规范的一个大子集,以满足您的所有配置需求。这还意味着该解析器非常健壮,易于理解,并且易于扩展。
清除错误消息
每当您的YAML文件出现语法问题时,库都会输出一条有用的消息,其中包含发生问题的文件名和行号。它大大简化了调试。
转储文件支持
它还能够在对象支持下将PHP数组转储到YAML,并提供内联级配置以获得漂亮的输出。
类型支持
它支持大多数YAML内置类型,如日期、整数、八进制数、布尔值等等……
完全合并键支持
完全支持引用、别名和完整的合并键。不要重复引用常用配置位。
使用Symfony 欧宝娱乐app下载地址YAML组件
Symf欧宝娱乐app下载地址ony Yaml组件由两个主要类组成:一个解析Yaml字符串(解析器),另一个将PHP数组转储到YAML字符串(自动倾卸车).
在这两个类之上,是Yaml类充当简化常用用途的薄包装器。
阅读YAML内容
的parse ()方法解析YAML字符串并将其转换为PHP数组:
1 2 3 4
使用欧宝娱乐app下载地址\组件\Yaml\Yaml;$价值= Yaml::解析(“foo:酒吧”);// $value = ['foo' => 'bar']
如果在解析期间发生错误,解析器将抛出抛出ParseExceptionexception指示错误类型和原始YAML字符串中错误发生的行:
1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\Yaml\异常\抛出ParseException;试一试{$价值= Yaml::解析(“……”);}抓(ParseException$异常) {printf('无法解析YAML字符串:%s',$异常->getMessage ());}
读取YAML文件
的parseFile ()方法解析给定文件路径的YAML内容,并将它们转换为PHP值:
1 2 3
使用欧宝娱乐app下载地址\组件\Yaml\Yaml;$价值= Yaml::parseFile (“/道路/ / file.yaml”);
如果在解析期间发生错误,解析器将抛出抛出ParseException
例外。
编写YAML文件
的dump ()方法将任何PHP数组转储到它的YAML表示:
1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址\组件\Yaml\Yaml;$数组= (“foo”= >“酒吧”,“酒吧”= > [“foo”= >“酒吧”,“酒吧”= >“记者”]];$yaml= Yaml::转储($数组);写入“/道路/ / file.yaml”,$yaml);
如果在转储期间发生错误,解析器将抛出DumpException例外。
扩展和内联数组
YAML格式支持两种数组表示形式:扩展数组和内联数组。默认情况下,转储器使用扩展表示:
1 2 3 4
foo:酒吧栏:foo:酒吧栏:巴兹
的第二个参数dump ()方法自定义输出从展开表示切换到内联表示的级别:
1
回声Yaml::转储($数组,1);
1 2
foo:酒吧栏:{foo:酒吧,栏:巴兹}
1
回声Yaml::转储($数组,2);
1 2 3 4
foo:酒吧栏:foo:酒吧栏:巴兹
缩进
默认情况下,YAML组件将使用4个空格作为缩进。这可以使用第三个参数进行更改,如下所示:
1 2
//使用8个空格缩进回声Yaml::转储($数组,2,8);
1 2 3 4
foo:酒吧栏:foo:酒吧栏:巴兹
数字字面值
长数字文字,如整数、浮点数或十六进制,在代码和配置文件中可读性较差。这就是为什么YAML文件允许添加下划线来提高它们的可读性:
1 2 3 4 5
参数:credit_card_number:1234年_5678_9012_3456long_number:10 _000_000_000pi:3.14159 _26535_89793hex_words:0 x_cafe_f00d
在解析YAML内容期间,所有的_
字符从数字文字内容中删除,因此可以包含的下划线数量或对内容进行分组的方式没有限制。
高级用法:Flags
对象解析和转储
方法可以转储对象DUMP_OBJECT
国旗:
1 2 3 4 5
$对象=新\ stdClass ();$对象->foo =“酒吧”;$倾倒= Yaml::转储($对象,2,4, Yaml::DUMP_OBJECT);/ / ! php /对象O: 8:“stdClass”:1:{:5:“foo”;销售:7:“酒吧”;}”
并使用PARSE_OBJECT
国旗:
1 2 3
$解析= Yaml::解析($倾倒, Yaml::PARSE_OBJECT);var_dump (is_object ($解析));/ /正确的回声$解析->foo;/ /酒吧
YAML组件使用PHP的serialize ()
方法生成对象的字符串表示形式。
谨慎
对象序列化是特定于此实现的,其他PHP YAML解析器可能无法识别php /对象
标签和非php实现当然不会——谨慎使用!
解析和转储对象为映射
方法可以将对象转储为Yaml映射DUMP_OBJECT_AS_MAP
国旗:
1 2 3 4 5
$对象=新\ stdClass ();$对象->foo =“酒吧”;$倾倒= Yaml::转储([“数据”= >$对象],2,4, Yaml::DUMP_OBJECT_AS_MAP);// $dump = "data:\n foo: bar"
并使用PARSE_OBJECT_FOR_MAP
国旗:
1 2 3 4
$解析= Yaml::解析($倾倒, Yaml::PARSE_OBJECT_FOR_MAP);var_dump (is_object ($解析));/ /正确的var_dump (is_object ($解析->数据);/ /正确的回声$解析->数据->foo;/ /酒吧
YAML组件使用PHP的(数组)
强制转换以生成对象的字符串表示形式作为映射。
处理无效类型
默认情况下,解析器将无效类型编码为零
.方法可以使解析器抛出异常PARSE_EXCEPTION_ON_INVALID_TYPE
国旗:
1 2
$yaml=”!php /对象\ ' O: 8:“stdClass”:1:{:5:“foo”;销售:7:“酒吧”;}\”;Yaml::解析($yaml, Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE);//抛出异常
类似地,你可以使用DUMP_EXCEPTION_ON_INVALID_TYPE
当倾销:
1 2
$数据=新\ stdClass ();//默认对象无效。Yaml::转储($数据,2,4, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE);//抛出异常
处理日期
默认情况下,YAML解析器会将看起来像日期或日期-时间的无引号字符串转换为Unix时间戳;例如2016-05-27
或2016 - 05 - 27 - t02:59:43.1z
(iso - 8601):
1
Yaml::解析(“2016-05-27”);/ / 1464307200
你可以把它转换成aDateTime
实例,使用PARSE_DATETIME
国旗:
1 2
$日期= Yaml::解析(“2016-05-27”, Yaml::PARSE_DATETIME);var_dump (get_class ($日期));/ /日期时间
转储多行文字块
在YAML中,多行可以表示为文字块。默认情况下,转储器将多行编码为内联字符串:
1 2 3
$字符串= (“字符串”= >“多个\在线\ nString”];$yaml= Yaml::转储($字符串);回声$yaml;// string: "Multiple\nLine\nString"
的文本块DUMP_MULTI_LINE_LITERAL_BLOCK
国旗:
1 2 3 4 5 6 7
$字符串= (“字符串”= >“多个\在线\ nString”];$yaml= Yaml::转储($字符串,2,4, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK);回声$yaml;// string: |/ /多个/ /行/ /字符串
解析PHP常量
默认情况下,YAML解析器将内容中包含的PHP常量视为常规字符串。使用PARSE_CONSTANT
旗帜和特殊php /常量!
语法来解析它们为正确的PHP常量:
1 2 3
$yaml='{foo: PHP_INT_SIZE, bar: !php/const PHP_INT_SIZE}';$参数= Yaml::解析($yaml, Yaml::PARSE_CONSTANT);/ /参数美元=[“foo”= >“PHP_INT_SIZE”,“酒吧”= > 8];
解析PHP枚举
YAML解析器支持的PHP枚举,包括单位枚举和支持枚举。默认情况下,它们被解析为常规字符串。使用PARSE_CONSTANT
旗帜和特殊php /枚举!
语法来解析它们为正确的PHP枚举:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
enum FooEnum:字符串{情况下Foo =“foo”;情况下酒吧=“酒吧”;}/ /……$yaml='{foo: FooEnum:: foo, bar: !php/enum FooEnum:: foo}';$参数= Yaml::解析($yaml, Yaml::PARSE_CONSTANT);// foo键的值是一个字符串,因为它错过了' !php /枚举的语法/ /参数美元=[“foo”= >“FooEnum: foo”,“酒吧”= > FooEnum:: foo);$yaml='{foo: FooEnum:: foo, bar: !php/enum FooEnum:: foo ->值}';$参数= Yaml::解析($yaml, Yaml::PARSE_CONSTANT);// foo键的值是一个字符串,因为它错过了' !php /枚举的语法/ /参数美元=[“foo”= >“FooEnum: foo”,“酒吧”= >“foo”);
6.2
Symfony 6.2中引入了对PHP枚举的支持。欧宝娱乐app下载地址
二进制数据的解析和转储
非UTF-8编码的字符串被转储为base64编码的数据:
1 2 3 4
$imageContents= file_get_contents (__DIR__.“/图片/ logo.png”);$倾倒= Yaml::转储([“标志”= >$imageContents]);// logo: !!二进制iVBORw0KGgoAAAANSUhEUgAAA6oAAADqCAY...
类型的二进制数据将自动解析!!二进制
YAML标签:
1 2 3
$倾倒=的标志:! !二进制iVBORw0KGgoAAAANSUhEUgAAA6oAAADqCAY...';$解析= Yaml::解析($倾倒);$imageContents=$解析[“标志”];
解析和转储自定义标记
除了内置支持的标签php /常量!
而且!!二进制
,您可以定义自己的自定义YAML标记并使用PARSE_CUSTOM_TAGS
国旗:
1 2 3 4 5
$数据="!My_tag {foo: bar}";$解析= Yaml::解析($数据, Yaml::PARSE_CUSTOM_TAGS);// $parsed = 欧宝娱乐app下载地址Symfony\Component\Yaml\Tag\TaggedValue('my_tag', ['foo' => 'bar']);$tagName=$解析->getTag ();// $tagName = 'my_tag'$tagValue=$解析->getValue ();// $tagValue = ['foo' => 'bar']
如果要转储的内容包含TaggedValue对象,它们会自动转换为YAML标签:
1 2 3 4 5
使用欧宝娱乐app下载地址\组件\Yaml\标签\TaggedValue;$数据=新TaggedValue (“my_tag”, (“foo”= >“酒吧”]);$倾倒= Yaml::转储($数据);// $dump = '!My_tag {foo: bar}'
转储空值
官方YAML规范使用这两种方法零
而且~
表示空值。该组件使用零
默认情况下,当转储空值时,但您可以将它们转储为~
与DUMP_NULL_AS_TILDE
国旗:
1 2 3 4 5
$倾倒= Yaml::转储([“foo”= >零]);// foo: null$倾倒= Yaml::转储([“foo”= >零],2,4, Yaml::DUMP_NULL_AS_TILDE);// foo: ~
语法验证
命令可以通过CLI验证YAML内容的语法LintCommand命令。
首先,安装Console组件:
1
$作曲家需要symfony/控制台欧宝娱乐app下载地址
创建控制台应用程序线头:yaml
作为它唯一的命令:
1 2 3 4 5 6 7 8 9
/ / lint.php使用欧宝娱乐app下载地址\组件\控制台\应用程序;使用欧宝娱乐app下载地址\组件\Yaml\命令\LintCommand;(新应用程序(yaml /线头的))->add (新LintCommand ())->getApplication ()->setDefaultCommand (“线头:yaml”,真正的)->run ();
然后,执行验证内容的脚本:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#验证单个文件$PHP lint.php路径/到/file.yaml#或验证多个文件$PHP lint.php路径/to/file1。/ / file2.yaml yaml路径#或目录下的所有文件$PHP lint.php的路径/到/目录#或多个目录下的所有文件$PHP lint.php路径/to/directory1路径/to/directory2#或传递给STDIN的内容$猫路径/ /文件。yaml|php lint.php#你也可以排除一个或多个文件的检测$PHP lint.php path/to/directory——exclude=path/to/directory/foo。yaml——排除= / /目录/ bar.yaml路径
结果被写入STDOUT,默认情况下使用纯文本格式。添加- - -格式
选项获取JSON格式的输出:
1
$PHP lint.php路径/到/file.yaml- - -格式json
提示
检测命令还将报告检查的YAML文件中的任何弃用。例如,这可能有助于在自动化测试期间识别YAML文件内容的弃用。
YAML格式
标量
标量的语法类似于PHP语法。
字符串
YAML中的字符串可以用单引号和双引号进行包装。在某些情况下,它们也可以不被引用:
1 2 3 4 5
一个字符串在YAMLYAML中的单引号字符串YAML中的双引号字符串
当字符串以一个或多个相关空格开始或结束时,带引号的样式非常有用,因为在解析其内容时,不带引号的字符串将在两端进行修剪。当字符串包含特殊字符或保留字符时,需要使用引号。
当使用单引号字符串时,任何单引号'
它的内部内容必须加倍才能转义:
1
“单引号”'在单引号字符串内'
包含下列任意字符的字符串必须加引号。虽然您可以使用双引号,但对于这些字符,使用单引号更方便,这样可以避免转义任何反斜杠\
:
:
,{
,}
,[
,]
,,
,&
,*
,#
,?
,|
,-
,<
,>
,=
,!
,%
,@
,`
双引号样式提供了一种表达任意字符串的方法,使用\
转义字符和序列。例如,当您需要嵌入一个\ n
或字符串中的Unicode字符。
1
" YAML\n中的双引号字符串"
如果字符串包含以下任意控制字符,则必须使用双引号转义:
\ 0
,\ x01
,\ x02
,\ x03
,\ x04
,\ x05
,\ x06
,、一个
,\ b
,\ t
,\ n
,v \
,\ f
,r \
,\ x0e
,\ x0f
,\ x10
,\ x11
,\ x12
,\ * 13
,\ x14英寸
,\连接
,\ x16
,\ x17
,\ x18
,\ x19
,\ x1a
,\ e
,\ x1c
,\ x1d
,\ x1e
,\ x1f
,\ N
,\ _
,L \
,\ P
最后,在其他情况下,字符串必须使用双引号,无论你是使用单引号还是双引号:
- 当字符串为
真正的
或假
(否则,它将被视为一个布尔值); - 当字符串为
零
或~
(否则,它将被视为一个零
值); - 当字符串看起来像一个数字时,例如整数(例如。
2
,14
,等等),浮点数(例如。2.6
,14.9
)和指数数(例如:12 e7
,等等)(否则,它将被视为数值); - 当字符串看起来像一个日期(例如:
2014-12-31
)(否则将自动转换为Unix时间戳)。
当字符串包含换行符时,可以使用由管道(|
),表示该字符串将跨越几行。在字面量中,换行符被保留:
1 2 3
|\/ /| |\/| | / /| | | |__
字符串也可以用折叠样式来写,表示为>
,其中每个换行符都被空格取代:
12 3 4 5 6 7 8 9 10 11 12 13
>这是一个非常长的句子,在YAML中跨越了几行。#这将被解析如下:(注意后面的\n)#“这是一个非常长的句子,在YAML中跨越了几行。\n”>-这是一个非常长的句子,在YAML中跨越了几行。#这将被解析如下:(不带末尾\n)#“这是一个非常长的句子,在YAML中跨越了好几行。”
请注意
注意前面例子中每行前的两个空格。它们不会出现在结果的PHP字符串中。
零位
YAML中的空值可以用零
或~
.
布尔值
YAML中的布尔值用真正的
而且假
.
集合
YAML文件很少用于描述简单的标量。大多数时候,它描述一个集合。YAML集合可以是一个序列(PHP中的索引数组)或元素的映射(PHP中的关联数组)。
序列使用破折号后面加空格:
1 2 3
-PHP-Perl-Python
上面的YAML文件相当于下面的PHP代码:
1
[“PHP”,“Perl”,“巨蟒”];
映射使用冒号后跟空格(:
)来标记每个键/值对:
1 2 3
PHP:5.2MySQL:5.1Apache:2.2.20
这相当于下面的PHP代码:
1
[“PHP”= >5.2,“MySQL”= >5.1,“阿帕奇”= >“2.2.20”];
请注意
在映射中,键可以是任何有效的标量。
冒号和值之间的空格数无关紧要:
1 2 3
PHP:5.2MySQL:5.1Apache:2.2.20
YAML使用缩进和一个或多个空格来描述嵌套集合:
1 2 3 4 5 6
“欧宝娱乐app下载地址symfony 1.0”:PHP:5.0推动:1.2“欧宝娱乐app下载地址symfony 1.2”:PHP:5.2推动:1.3
上面的YAML相当于下面的PHP代码:
1 2 3 4 5 6 7 8 9 10
[“欧宝娱乐app下载地址symfony 1.0”= > [“PHP”= >5.0,“推动”= >1.2),“欧宝娱乐app下载地址symfony 1.2”= > [“PHP”= >5.2,“推动”= >1.3,],];
在YAML文件中使用缩进时,有一件重要的事情需要记住:缩进必须使用一个或多个空格,但绝不可以使用制表器.
你可以嵌套序列和映射,因为你喜欢:
1 2 3 4 5 6
“第一章”:-简介-事件类型“第二章”:-简介-助手
YAML还可以为集合使用流样式,使用显式指示器而不是缩进来表示范围。
序列可以写成方括号内以逗号分隔的列表([]
):
1
(PHP,Perl,Python)
映射可以写成用逗号分隔的键/值列表({}
):
1
{PHP:5.2,MySQL:5.1,Apache:2.2.20}
你可以混合搭配样式来获得更好的可读性:
1 2
“第一章”:(介绍,事件类型)“第二章”:(介绍,助手)
1 2
“欧宝娱乐app下载地址symfony 1.0”:{PHP:5.0,推动:1.2}“欧宝娱乐app下载地址symfony 1.2”:{PHP:5.2,推动:1.3}
评论
注释可以在YAML中添加,只需在注释前加上一个散列标记(#
):
1 2 3
#评论一行“欧宝娱乐app下载地址symfony 1.0”:{PHP:5.0,推动:1.2}在一行的末尾注释“欧宝娱乐app下载地址symfony 1.2”:{PHP:5.2,推动:1.3}
请注意
注释被YAML解析器忽略,并且不需要根据集合中嵌套的当前级别缩进。
显式类型
YAML规范定义了一些标记来显式地设置任何数据的类型:
12 3 4 5 6 7 8 9 10 11 12 13
数据:#此值被解析为字符串(它不会转换为DateTime)start_date:!!str2002-12年-14年#此值被解析为浮点数(它将是3.0而不是3)价格:!!浮动3.#该值被解析为base64编码的二进制数据图片:!!二进制| R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs=
不支持的YAML特性
Symfony YAML组件不支持以下YAML特性:欧宝娱乐app下载地址
- 多文档(
---
而且...
标记); - 复杂的映射键和复杂的值
?
; - 标记值作为键;
- 以下标签和类型:
!!集
,!!的核心
,!!双
,!!seq
,!!保龄球
,!!在t
,!!合并
,!!零
,!!时间戳
,!!价值
,!!yaml
; - 标签(
标签
指令;例子:%的标签!标签:example.com, 2000: app /
)和标签引用(例如:! <标签:example.com, 2000: app / foo >
); - 使用类似序列的语法来映射元素(例如:
{foo,酒吧}
;使用{foo: ~, bar: ~}
相反)。