定义和处理配置值
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
定义和处理配置值
验证配置值
从各种各样的资源加载配置值后,可以验证值和它们的结构使用的“定义”部分配置组件。配置值通常会表现出一定的层次结构。某种类型的值应该也被限制在数量或一个给定的一组值中的一个。例如,下面的配置(Yaml)显示了一个清晰的层次结构和一些验证规则,应该应用(如:”的值auto_connect
必须是一个布尔值”):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
auto_connect:真正的default_connection:mysql连接:mysql:主持人:本地主机司机:mysql用户名:用户密码:通过sqlite:主持人:本地主机司机:sqlite记忆:真正的用户名:用户密码:通过
当加载多个配置文件,可以合并和覆盖一些值。其他值不应合并,当第一次遇到。此外,一些键只能当另一个键都有一个特定值(在上面的示例配置:内存
关键时才有意义司机
是sqlite
)。
定义的层次结构使用TreeBuilder配置值
所有的规则配置值可以定义使用TreeBuilder。
一个TreeBuilder从一个定制的实例应该返回配置
类的实现ConfigurationInterface:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
名称空间Acme\DatabaseConfiguration;使用ob娱乐下载\组件\配置\定义\ConfigurationInterface;使用ob娱乐下载\组件\配置\定义\构建器\TreeBuilder;类DatabaseConfiguration实现了ConfigurationInterface{公共函数getConfigTreeBuilder(){美元treeBuilder=新TreeBuilder ();美元rootNode=美元treeBuilder- >根(“数据库”);/ /……添加节点定义树的根返回美元treeBuilder;}}
将节点定义添加到树中
变量节点
树包含节点定义可以在语义的方法。这意味着,使用缩进和流利的符号,它可以反映实际结构的配置值:
1 2 3 4 5 6 7 8 9 10
美元rootNode- >孩子()- >booleanNode (“auto_connect”)- >defaultTrue ()- >结束()- >scalarNode (“default_connection”)- >defaultValue (“默认”)- >结束()- >结束();
根节点本身是一个数组节点,和有孩子,就像布尔节点auto_connect
和标量节点default_connection
。总的来说:定义一个节点后,调用结束()
带你一步的层次结构。
数组节点
可以添加一个更深层次的层次结构,通过添加一个节点数组。数组节点本身,可能有一组预定义的变量节点:
1 2 3 4 5 6 7 8 9 10 11 12
美元rootNode- >孩子()- >arrayNode (“连接”)- >孩子()- >scalarNode (“司机”)- >结束()- >scalarNode (“主机”)- >结束()- >scalarNode (“用户名”)- >结束()- >scalarNode (“密码”)- >结束()- >结束()- >结束()- >结束();
或者你可能定义一个数组节点内部为每个节点原型:
1 2 3 4 5 6 7 8 9 10 11 12 13
美元rootNode- >孩子()- >arrayNode (“连接”)- >原型(“数组”)- >孩子()- >scalarNode (“司机”)- >结束()- >scalarNode (“主机”)- >结束()- >scalarNode (“用户名”)- >结束()- >scalarNode (“密码”)- >结束()- >结束()- >结束()- >结束();
原型可以用于添加一个定义在当前节点可能会重复很多次了。根据原型定义在上面的示例中,可以有多个连接数组(包含一个司机
,主机
等)。
数组节点选择
在定义数组的孩子节点,您可以提供选项:
-
useAttributeAsKey ()
- 提供一个子节点的名称,其价值应该用作键在生成的数组中。
-
requiresAtLeastOneElement ()
-
至少应该有一个数组中的元素(只有当工作
isRequired ()
也叫)。 -
addDefaultsIfNotSet ()
- 如果任何子节点有默认值,如果显式值没有使用它们。
一个这样的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元rootNode- >孩子()- >arrayNode (“参数”)- >isRequired ()- >requiresAtLeastOneElement ()- >useAttributeAsKey (“名字”)- >原型(“数组”)- >孩子()- >scalarNode (“价值”)- >isRequired ()- >结束()- >结束()- >结束()- >结束()- >结束();
YAML的配置可能会看起来像这样:
1 2 3
数据库:参数:param1:{值:param1val}
在XML中,每个参数
节点会有一个的名字
属性(连同价值
),它将被删除,用作数组在最后的关键元素。的useAttributeAsKey
用于正常化是数组指定不同的格式,比如XML和YAML。
违约和所需的值
对于所有的节点类型,可以定义默认值和替换值一个节点有一定的价值:
-
defaultValue ()
- 设置一个默认值
-
isRequired ()
- 必须定义(但可能是空的)
-
cannotBeEmpty ()
- 可能不包含空值吗
-
默认* ()
-
(
零
,真正的
,假
),快捷方式defaultValue ()
-
治疗*像()
-
(
零
,真正的
,假
),提供一个替换值的值*。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30
美元rootNode- >孩子()- >arrayNode (“连接”)- >孩子()- >scalarNode (“司机”)- >isRequired ()- >cannotBeEmpty ()- >结束()- >scalarNode (“主机”)- >defaultValue (“localhost”)- >结束()- >scalarNode (“用户名”)- >结束()- >scalarNode (“密码”)- >结束()- >booleanNode (“记忆”)- >defaultFalse ()- >结束()- >结束()- >结束()- >arrayNode (“设置”)- >addDefaultsIfNotSet ()- >孩子()- >scalarNode (“名字”)- >isRequired ()- >cannotBeEmpty ()- >defaultValue (“价值”)- >结束()- >结束()- >结束()- >结束();
合并选项
关于合并过程可能会提供额外的选项。数组:
-
performNoDeepMerging ()
- 当第二个配置中定义的值也是数组,不要试图合并一个数组,但完全覆盖它
所有节点:
-
cannotBeOverwritten ()
- 不要让其他配置阵列为这个节点覆盖现有的价值
追加的部分
如果你有一个复杂的配置验证树能长到大,你可能想要把它分成部分。你可以通过一个单独的部分节点,然后添加到主树append ()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
公共函数getConfigTreeBuilder(){美元treeBuilder=新TreeBuilder ();美元rootNode=美元treeBuilder- >根(“数据库”);美元rootNode- >孩子()- >arrayNode (“连接”)- >孩子()- >scalarNode (“司机”)- >isRequired ()- >cannotBeEmpty ()- >结束()- >scalarNode (“主机”)- >defaultValue (“localhost”)- >结束()- >scalarNode (“用户名”)- >结束()- >scalarNode (“密码”)- >结束()- >booleanNode (“记忆”)- >defaultFalse ()- >结束()- >结束()- >追加(美元这- >addParametersNode ())- >结束()- >结束();返回美元treeBuilder;}公共函数addParametersNode(){美元构建器=新TreeBuilder ();美元节点=美元构建器- >根(“参数”);美元节点- >isRequired ()- >requiresAtLeastOneElement ()- >useAttributeAsKey (“名字”)- >原型(“数组”)- >孩子()- >scalarNode (“价值”)- >isRequired ()- >结束()- >结束()- >结束();返回美元节点;}
这也有助于你避免重复配置的如果你有部分重复在不同的地方。
归一化
当他们第一次规范化的处理配置文件,然后合并,最后树用于验证结果数组中。正常化过程用于删除的一些差异源于不同的配置格式,主要是Yaml和XML之间的差异。
键是通常使用的分隔符_
在Yaml和- - - - - -
在XML。例如,auto_connect
在Yaml和auto-connect
。正常化将使这两种auto_connect
。
谨慎
目标关键不会改变如果是混合foo-bar_moo
或者如果它已经存在。
Yaml和XML之间的另一个差别是数组的值可能表示。在Yaml您可能有:
1 2
枝:扩展:[' twig.extension.foo ',“twig.extension.bar”]
和XML:
1 2 3 4
<枝:配置><枝:扩展>twig.extension.foo< /枝:扩展><枝:扩展>twig.extension.bar< /枝:扩展>< /枝:配置>
这种差异可以删除正常化的复数在XML中使用的关键。您可以指定您想要以这种方式多元化的一个关键fixXmlConfig ()
:
1 2 3 4 5 6 7 8
美元rootNode- >fixXmlConfig (“扩展”)- >孩子()- >arrayNode (“扩展”)- >原型(“标量”)- >结束()- >结束()- >结束();
如果它是一个不规则的多元化可以指定要使用的复数作为第二个参数:
1 2 3 4 5 6
美元rootNode- >fixXmlConfig (“孩子”,“孩子”)- >孩子()- >arrayNode (“孩子”)- >结束();
以及解决这个,fixXmlConfig
确保单个xml元素仍然变成了一个数组。所以你可能有:
1 2
<连接>默认的< /连接><连接>额外的< /连接>
有时只有:
1
<连接>默认的< /连接>
默认情况下连接
将一个数组在第一种情况下,一个字符串在第二很难验证。你可以确保它总是一个数组fixXmlConfig
。
您可以进一步控制正常化过程如果你需要。例如,您可能想要让一个字符串,作为一个特定的键或几个键集显式地设置。所以,如果一切除了的名字
在这个配置是可选的:
1 2 3 4 5 6
连接:名称:my_mysql_connection主持人:本地主机司机:mysql用户名:用户密码:通过
您可以允许以下:
1
连接:my_mysql_connection
通过改变一个字符串值到一个关联数组的名字
的关键:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元rootNode- >孩子()- >arrayNode (“连接”)- >beforeNormalization ()- >ifString ()- >然后(函数(美元v){返回数组(“名字”= >美元v);})- >结束()- >孩子()- >scalarNode (“名字”)- >isRequired ()/ /……- >结束()- >结束()- >结束();
验证规则
可以使用提供更先进的验证规则ExprBuilder。这个构建器实现了一个连贯接口为一个众所周知的控制结构。构建器是用来将先进的验证规则添加到节点定义,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元rootNode- >孩子()- >arrayNode (“连接”)- >孩子()- >scalarNode (“司机”)- >isRequired ()- >validate ()- >ifNotInArray (数组(“mysql”,“sqlite”,“该”))- >thenInvalid (“无效的数据库驱动程序“% s””)- >结束()- >结束()- >结束()- >结束()- >结束();
一个验证规则总是一个“如果”部分。您可以指定这个部分在以下方面:
ifTrue ()
ifString ()
ifNull ()
ifArray ()
ifInArray ()
ifNotInArray ()
总是()
一个验证规则也需要一个“然后”部分:
然后()
thenEmptyArray ()
thenInvalid ()
thenUnset ()
通常,“然后”是一个闭包。其返回值将被用作一个新值的节点,而不是节点的原始值。
处理配置值
的处理器使用树因为它建成使用TreeBuilder处理多个阵列的配置值应该合并。如果没有预期的任何值类型,是强制性的,但未定义,或其他方式无法验证,就会抛出一个异常。否则,结果是一个干净的配置值的数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\Yaml\Yaml;使用ob娱乐下载\组件\配置\定义\处理器;使用Acme\DatabaseConfiguration;美元config1= Yaml::解析(__DIR__。' / src /马提亚/配置/ config.yml ');美元config2= Yaml::解析(__DIR__。' / src /马提亚/配置/ config_extra.yml ');美元配置=数组(美元config1,美元config2);美元处理器=新处理器();美元配置=新DatabaseConfiguration;美元processedConfiguration=美元处理器- >processConfiguration (美元配置,美元配置);