定义和处理配置值
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
定义和处理配置值
验证配置值
从各种资源加载配置值后,可以使用Config组件的“Definition”部分验证这些值及其结构。通常期望配置值显示某种层次结构。此外,值应该是某种类型的,在数量上受到限制,或者是一组给定值中的一个。例如,下面的配置(在Yaml中)显示了一个清晰的层次结构和一些应该应用于它的验证规则(例如:“the value For。auto_connect
必须为布尔值"):
12 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:
12 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
.通常:定义节点后,调用结束()
这让你的地位更上一层楼。
节点类型
可以通过使用适当的节点定义来验证所提供值的类型。节点类型:
- 标量
- 布尔
- Enum(2.1中新增)
- 数组
- 变量(未验证)
并且是用节点(名称、类型)美元
或者相关的快捷方式xxxxNode(名称)
方法。
Enum节点
2.1
enum节点是Symfony 2.1中新增的ob娱乐下载
Enum节点提供了一个约束来匹配给定的输入与一组值:
1 2 3 4 5 6 7
$rootNode->孩子()->enumNode (“性别”)->值(数组(“男”,“女”))->结束()->结束();
这将限制性别
任选其一男性
或女
.
数组节点
通过添加数组节点,可以向层次结构中添加更深的层次。数组节点本身可能有一组预定义的变量节点:
12 3 4 5 6 7 8 9 10 11 12
$rootNode->孩子()->arrayNode (“连接”)->孩子()->scalarNode (“司机”)->结束()->scalarNode (“主机”)->结束()->scalarNode (“用户名”)->结束()->scalarNode (“密码”)->结束()->结束()->结束()->结束();
或者你可以为数组节点中的每个节点定义一个原型:
12 3 4 5 6 7 8 9 10 11 12 13
$rootNode->孩子()->arrayNode (“连接”)->原型(“数组”)->孩子()->scalarNode (“司机”)->结束()->scalarNode (“主机”)->结束()->scalarNode (“用户名”)->结束()->scalarNode (“密码”)->结束()->结束()->结束()->结束();
原型可用于添加定义,该定义可在当前节点内重复多次。根据上面示例中的原型定义,可以有多个连接数组(包含一个司机
,宿主
等)。
阵列节点选项
在定义数组节点的子节点之前,你可以提供如下选项:
-
useAttributeAsKey ()
- 提供子节点的名称,其值应用作结果数组中的键。
-
requiresAtLeastOneElement ()
-
数组中至少有一个元素(仅当
isRequired ()
也被称为)。 -
addDefaultsIfNotSet ()
- 如果任何子节点具有默认值,则在没有提供显式值时使用它们。
举个例子:
12 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 ()
-
治疗*像()
-
(
零
,真正的
,假
),如果值为,则提供一个替换值*。
12 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 ()
:
12 34 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
通过将字符串值更改为关联数组的名字
作为关键:
12 3 4 5 6 7 8 9 10 11 12 13 14
$rootNode->孩子()->arrayNode (“连接”)->beforeNormalization ()->ifString ()->然后(函数($v){返回数组(“名字”= >$v);})->结束()->孩子()->scalarNode (“名字”)->isRequired ()/ /……->结束()->结束()->结束();
验证规则
方法可以提供更高级的验证规则ExprBuilder.这个构建器为一个著名的控制结构实现了一个流畅的接口。构建器用于向节点定义添加高级验证规则,例如:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
$rootNode->孩子()->arrayNode (“连接”)->孩子()->scalarNode (“司机”)->isRequired ()->validate ()->ifNotInArray (数组(“mysql”,“sqlite”,“该”))->thenInvalid (“无效数据库驱动程序“%s””)->结束()->结束()->结束()->结束()->结束();
验证规则总是有一个“if”部分。可以通过以下方式指定该部件:
ifTrue ()
ifString ()
ifNull ()
ifArray ()
ifInArray ()
ifNotInArray ()
总是()
验证规则还需要“then”部分:
然后()
thenEmptyArray ()
thenInvalid ()
thenUnset ()
通常,"then"是一个闭包。它的返回值将用作节点的新值,而不是节点的原始值。
处理配置值
的处理器方法构建树时使用该树TreeBuilder处理应合并的配置值的多个数组。如果任何值不是预期的类型,是强制的,但未定义,或者不能以其他方式验证,则会抛出异常。否则,结果是一个干净的配置值数组:
12 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 ($配置,$配置);