YAML与语法与symfony惯例 YAML Syntax and Symfony Conventions
symfony默认使用YAML格式存放配置信息,而不用传统的INI或者XML格式。YAML通过缩进表示结构而且写起来很快。它的特点与基本规则在第一章里面已经讲到了。不过,在写YAML的时候,你还需要记住几条规则。本节将介绍最常用的几个几个规则。想完整的了解YAML,请访问YAML网站(http://www.yaml.org/)。
首先,绝不要在YAML文件里使用制表符(tab),应该使用空格。YAML解析器不能解析制表符,所以请使用空格来缩进(在symfony里面使用两个空格缩进),如例5-1。
例 5-1 - YAML文件禁止制表符(tab)
# 绝不用制表符
all:
-> mail:
-> -> webmaster: webmaster@example.com
# 应该使用空格
all:
mail:
webmaster: webmaster@example.com
如果你的参数是以空格开始或者结束的字符串,应使用单引号把它包起来。如果一个字符串参数包含特殊字符,也要用单引号包起来,如例5-2。
例 5-2 - 非标准的字符串要用单引号包起来
错误1: This field is compulsory
错误2: ' This field is compulsory '
错误3: 'Don''t leave this field blank' # 必须用两个单引号来表示字符串中的'
利用特殊字符头(> 与 |)与一个缩进,长的字符串可以跨行表示。如例5-3。
例 5-3 - 定义长的多行字符串
accomplishment: > # 由>开头的折叠式
Mark set a major league # 每一个换行被折叠成一个空格
home run record in 1998. # 使得YAML可读性更强
stats: | # 由|开头的原始式
65 Home Runs # 所有的换行都被保留
0.278 Batting Average # 缩进不会在结果里出现
如果要定义数组,需要用方括号把元素括起来或者使用展开的减号语法,如例 5-4。
例 5-4 - YAML数组语法
# 数组语法的简写
players: [ Mark McGwire, Sammy Sosa, Ken Griffey ]
# 数组的展开语法
players:
- Mark McGwire
- Sammy Sosa
- Ken Griffey
如果要定义联合数组或者说哈希,要用大括号把元素括起来,键与值key: value中间保留一个空格。也可以用展开语法,每一个新的建增加一个缩进与换行,如例5-5。
例 5-5 - YAML联合数组语法
# 错误的语法,冒号后缺少空格
mail: {webmaster:webmaster@example.com,contact:contact@example.com}
# 联合数组的正确简写
mail: { webmaster: webmaster@example.com, contact: contact@example.com }
# 联合数组的展开语法
mail:
webmaster: webmaster@example.com
contact: contact@example.com
定义一个布尔值时,on、1或者true代表肯定值,off、0、或者false代表否定值。如例5-6。
例 5-6 - YAML 布尔值语法
true_values: [ on, 1, true ]
false_values: [ off, 0, false ]
请不要吝啬使用注释(以井号#开头)还有空格,这会使注释文件更易读,如例5-7。
例 5-7 - YAML 注释语法与值对齐
# 这是一个注释
mail:
webmaster: webmaster@example.com
contact: contact@example.com
admin: admin@example.com # 多的空格可以帮助对齐
在某些symfony配置文件里面,你会发现一些行以#开头(YAML解析器会忽略这些行),但这些行看上去像普通的设置行。这是一个symfony的惯例:默认设置,从symfony内核里其他的YAML文件里面继承的设置,这些会在你的应用程序配置文件里面出现并用#注释起来,给你参考。如果你想改变这些参数,只要把注释去掉就可以了。如例5-8。
例 5-8 - 注释里的默认配置
# 缓存的默认值是关闭
settings:
# cache: off
# 如果你想修改这个值,去掉注释
settings:
cache: on
symfony有时会把一些参数定义分类。一个类里面的所有设置都放在分类头下面。把长的key: value列表分组能增强可读性。类头以点(.)。如例5-9。
例 5-9 - 类别头与键类似,但是以.开头
all:
.general:
tax: 19.6
mail:
webmaster: webmaster@example.com
在这个例子里,mail是一个键,general只是一个类别头。类别头可以当作不存在,如例5-10。tax参数实际上是all键的直接子元素。
例 5-10 - 类别头只用于增强可读性,实际上可以忽略
all:
tax: 19.6
mail:
webmaster: webmaster@example.com
SIDEBAR 如果你不喜欢YAML
YAML只是一个给PHP代码定义设置的界面,所以YAML里面定义的配置信息都会被转换成PHP代码。浏览一个应用程序,查看他的缓存的配置信息(例,在cache/myapp/dev/config/)。你会发现YAML配置对应的PHP文件。这一章后面我们会详细介绍配置缓存。
好消息是如果你不喜欢YAML文件,你可以自己动手,使用PHP代码或者其他的格式(XML,INI等)。在本书中,你会遇到其他的不使用YAML定义配置的方法,在第19章你会了解如何替换symfony的配置文件处理器。如果你用好它们,你可以利用这些技巧绕开配置文件或者定义你自己的格式。