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组件的更多信息YAML格式文章。

安装

1
作曲家需要symfony / ya欧宝娱乐app下载地址ml

请注意

如果在Symfony应用程序之外安装此组件,则必须使用欧宝娱乐app下载地址供应商/ autoload.php代码中的文件以启用Composer提供的类自动加载机制。读这篇文章为更多的细节。

为什么?

Symfony Yaml的目标之一是在速欧宝娱乐app下载地址度和功能之间找到合适的平衡。它只支持处理配置文件所需的特性。值得注意的是:文档指令、多行引用消息、压缩块集合和多文档文件。

真正的解析器

它具有一个真正的解析器,能够解析YAML规范的大部分子集,满足您的所有配置需求。这还意味着解析器非常健壮,易于理解,并且足够简单,可以进行扩展。

清除错误消息

每当您对YAML文件进行语法问题时,库会将有用的消息与文件名和出现问题发生的行号输出有用的邮件。它缓解了很多调试。

转储文件支持

它还能够使用对象支持将PHP阵列转移到YAML,以及漂亮输出的内联级配置。

类型支持

它支持大多数YAML内置类型,如日期、整数、八进制、布尔值等等……

完全合并键支持

完全支持引用、别名和完全合并键。不要重复引用公共配置位。

使用Symfony 欧宝娱乐app下载地址YAML组件

Symf欧宝娱乐app下载地址ony Yaml组件包含两个主要类:一个解析Yaml字符串(欧宝娱乐app下载地址symfony \ component \ yaml \ parser),另一个则将PHP数组转储为YAML字符串(欧宝娱乐app下载地址Symfony \ \ Yaml \翻车机组件).

在这两个班级之上,欧宝娱乐app下载地址Symfony \ \ Yaml \ Yaml组件类充当简化常用用法的薄包装器。

阅读YAML内容

parse()方法解析YAML字符串并将其转换为PHP数组:

欧宝娱乐app下载地址Symfony \ \ Yaml \ Yaml组件美元的价值yaml.::解析“foo:酒吧”);// $ value = ['foo'=>'bar']

如果解析过程中发生错误,解析器将抛出欧宝娱乐app下载地址Symfony \ \ Yaml \例外\ ParseException组件例外指示错误类型和原始yaml字符串中的行,其中发生错误:

欧宝娱乐app下载地址Symfony \ \ Yaml \例外\ ParseException组件尝试美元的价值yaml.::解析'...');抓住抛出ParseException$例外Printf.'无法解析YAML字符串:%s'$例外- >getMessage());

阅读YAML文件

parseFile ()方法解析给定文件路径的yaml内容并将它们转换为php值:

欧宝娱乐app下载地址Symfony \ \ Yaml \ Yaml组件美元的价值yaml.::parseFile“/道路/ / file.yaml”);

如果解析过程中发生错误,解析器将抛出抛出ParseException例外。

写yaml文件

dump ()方法将任何PHP数组转储到其YAML表示:

欧宝娱乐app下载地址Symfony \ \ Yaml \ Yaml组件$阵列'foo'=>“酒吧”“酒吧”=>'foo'=>“酒吧”“酒吧”=>'Baz'],];$ yaml.yaml.::倾倒$阵列);file_put_contents.“/道路/ / file.yaml”$ yaml.);

如果在转储期间发生错误,则解析器会抛出一个欧宝娱乐app下载地址Symfony \组件\ Yaml \ \ DumpException异常例外。

扩展和内联阵列

YAML格式支持两种数组表示,展开的一种和内联的一种。默认情况下,转储程序使用扩展表示:

1 2 3 4
喷火酒吧酒吧喷火酒吧酒吧巴兹

第二个论点dump ()方法自定义输出从扩展表示到内联的级别的级别:

回声yaml.::倾倒$阵列1);
1 2
喷火酒吧酒吧喷火酒吧酒吧巴兹
1
回声yaml.::倾倒$阵列2);
1 2 3 4
喷火酒吧酒吧喷火酒吧酒吧巴兹

缩进

默认情况下,yaml组件将使用4个空格进行缩进。这可以使用第三个参数更改,如下所示:

//使用8个空格缩进回声yaml.::倾倒$阵列28);
1 2 3 4
喷火酒吧酒吧喷火酒吧酒吧巴兹

数字字面值

长数字文字,是整数,浮点或十六进制,以其代码和配置文件的可读性差。这就是yaml文件允许添加下划线以提高其可读性的原因:

1 2 3 4 5
参数信用卡号码1234年_5678_9012_3456long_number10_000_000_000PI.3.14159_26535_89793hex_words0 x_cafe_f00d

在解析YAML内容期间,所有_字符将从数字文字内容中删除,因此可以包含的下划线数量或对内容进行分组的方式没有限制。

高级使用:标志

对象解析和转储

属性转储对象DUMP_OBJECT国旗:

$对象新的\ stdClass();$对象- >喷火“酒吧”$倾倒yaml.::倾倒$对象24yaml.::DUMP_OBJECT);/ / ! php /对象O: 8:“stdClass”:1:{:5:“foo”;销售:7:“酒吧”;}”

并使用PARSE_OBJECT国旗:

美元的解析yaml.::解析$倾倒yaml.::PARSE_OBJECT);var_dumpis_object美元的解析));/ /正确的回声美元的解析- >喷火// 酒吧

yaml组件使用PHPserialize ()生成对象的字符串表示的方法。

警告

对象序列化是特定于此实现的,其他PHP YAML解析器可能无法识别php /对象标签和非PHP实现肯定不会 - 与自由裁量权一起使用!

解析和转储对象为映射

您可以通过使用yaml映射将对象转储dump_object_as_map.国旗:

$对象新的\ stdClass();$对象- >喷火“酒吧”$倾倒yaml.::倾倒(['数据'=>$对象],24yaml.::dump_object_as_map.);// $ doviced =“数据:\ n foo:bar”

并使用PARSE_OBJECT_FOR_MAP国旗:

美元的解析yaml.::解析$倾倒yaml.::PARSE_OBJECT_FOR_MAP);var_dumpis_object美元的解析));/ /正确的var_dumpis_object美元的解析- >数据));/ /正确的回声美元的解析- >数据- >喷火// 酒吧

yaml组件使用PHP(数组)铸造以生成对象的字符串表示作为地图。

处理无效类型

默认情况下,解析器将无效类型编码为空值.您可以使用使用的解析器抛出异常PARSE_EXCEPTION_ON_INVALID_TYPE国旗:

$ yaml.'!PHP / Object \'o:8:“stdclass”:1:{s:5:“foo”; s:7:“bar”;}}'yaml.::解析$ yaml.yaml.::PARSE_EXCEPTION_ON_INVALID_TYPE);//抛出异常

类似地,你可以使用dump_exception_on_invalid_type.当倾销:

元数据新的\ stdClass();//默认对象无效。yaml.::倾倒元数据24yaml.::dump_exception_on_invalid_type.);//抛出异常

日期处理

默认情况下,YAML解析器会将看起来像日期或日期-时间的无引号字符串转换为Unix时间戳;例如2016-05-27或者2016-05-27T02:59:43.1zISO-8601.):

yaml.::解析'2016-05-27');// 1464307200

你可以把它转换成aDateTime实例使用PARSE_DATETIME国旗:

美元的日期yaml.::解析'2016-05-27'yaml.::PARSE_DATETIME);var_dumpget_class美元的日期));// 约会时间

转储多行文字块

在YAML中,多行可以表示为文字块。默认情况下,转储程序会将多行代码编码为内联字符串:

$字符串“字符串”=>“多\ n\ n字符串"];$ yaml.yaml.::倾倒$字符串);回声$ yaml.//字符串:“多个\ nline \ nstring”

可以让它使用一个文字块dump_multi_line_literal_block.国旗:

$字符串“字符串”=>“多\ n\ n字符串"];$ yaml.yaml.::倾倒$字符串24yaml.::dump_multi_line_literal_block.);回声$ yaml.//字符串:|// 多// 线// 细绳

解析PHP常量

默认情况下,YAML解析器将内容中包含的PHP常量视为常规字符串。使用PARSE_CONSTANT国旗和特殊php /常量!语法解析它们是正确的PHP常量:

$ yaml.php/const PHP_INT_SIZE} `$参数yaml.::解析$ yaml.yaml.::PARSE_CONSTANT);/ /参数美元=[“foo”= >“PHP_INT_SIZE”,“酒吧”= > 8];

二进制数据的解析和转储

您可以使用丢失二进制数据dump_base64_binary_data.国旗:

imageContents美元函数__dir__'/images/logo.png');$倾倒yaml.::倾倒([“标志”=>imageContents美元],24yaml.::dump_base64_binary_data.);// logo:!!二进制ivborw0kggoaaansuheugaaa6oaaadqcay ...

如果它们包含,则会自动解析二进制数据!!二进制YAML标记(不需要向YAML解析器传递任何标记):

$倾倒的标志:! !二进制iVBORw0KGgoAAAANSUhEUgAAA6oAAADqCAY……”美元的解析yaml.::解析$倾倒);imageContents美元美元的解析“标志”];

解析和转储自定义标记

除了像标签的内置支持之外php /常量!!!二进制,您可以定义自己的自定义YAML标记,并使用parse_custom_tags.国旗:

元数据“!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']

如果要转储的内容包含欧宝娱乐app下载地址symfony \ component \ yaml \ tag \ taggedValue对象,它们会自动转换为YAML标签:

欧宝娱乐app下载地址symfony \ component \ yaml \ tag \ taggedValue元数据新的taggedvalue.“my_tag”'foo'=>“酒吧”]);$倾倒yaml.::倾倒元数据);// $dump = '!My_tag {foo: bar}'

倾销Null值

官方YAML规范同时使用了这两种方法空值表示null值。该组件使用空值默认转储null值时,但您可以将它们丢弃为与之DUMP_NULL_AS_TILDE国旗:

$倾倒yaml.::倾倒(['foo'=>空值]);/ / foo:零$倾倒yaml.::倾倒(['foo'=>空值],24yaml.::DUMP_NULL_AS_TILDE);// foo:〜

语法验证

可以使用CLI验证YAML内容的语法欧宝娱乐app下载地址Symfony \组件\ \ LintCommand Yaml \命令命令。

首先,安装控制台组件:

1
作曲家需要Symfony / Co欧宝娱乐app下载地址nsole

创建控制台应用程序棉绒:yaml.作为它唯一的命令:

/ / lint.php欧宝娱乐app下载地址symfony \ component \ console \应用程序欧宝娱乐app下载地址Symfony \组件\ \ LintCommand Yaml \命令新的应用程序'yaml / lint'))- >添加新的LintCommand())- >getApplication.()- >setDefaultCommand“线头:yaml”真的- >跑步();

然后,执行脚本以验证内容:

12 3 4 5 6 7 8 9 10 11 12 13 14
#验证单个文件php lint.php路径/ to / file.yaml#或验证多个文件php lint.php路径/ / file1。/ / file2.yaml yaml路径#或目录中的所有文件php lint.php路径/ /目录中#或多个目录中的所有文件php lint.php路径/ to / directory1路径/ to / directory2#或内容传递给stdin/ / file.yaml猫路径|php lint.php

结果将写入STDOUT并默认使用纯文本格式。添加- 格式选项获取JSON格式的输出:

1
php lint.php路径/ to / file.yaml- 格式json

提示

linting命令还将报告检查过的YAML文件中的任何弃用。例如,这对于在自动化测试期间识别YAML文件内容的弃用可能很有用。

学到更多

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0许可证。