定义和处理配置值
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.3,现已不再维护。
读本页的更新版本用于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 15
数据库: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娱乐下载\组件\配置\定义\构建器\TreeBuilder;使用ob娱乐下载\组件\配置\定义\ConfigurationInterface;类DatabaseConfiguration实现了ConfigurationInterface{公共函数getConfigTreeBuilder(){$treeBuilder=新TreeBuilder (“数据库”);/ /……将节点定义添加到树的根/ / treeBuilder - > getRootNode() - >…返回$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(类似于标量,但它只允许有限的值集)
- 数组
- 变量(未验证)
并且是用节点(名称、类型)美元
或者相关的快捷方式xxxxNode(名称)
方法。
数字节点约束
数值节点(浮点数和整数)提供了两个额外的约束-min ()而且max ()-允许验证值:
12 3 4 5 6 7 8 9 10 11 12 13
$rootNode->孩子()->integerNode (“positive_value”)->分钟(0)->结束()->floatNode (“big_value”)->max (5 e45)->结束()->integerNode (“value_inside_a_range”)->分钟(-50年)->max (50)->结束()->结束();
Enum节点
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 14
$rootNode->孩子()->arrayNode (“连接”)->arrayPrototype ()->孩子()->scalarNode (“司机”)->结束()->scalarNode (“主机”)->结束()->scalarNode (“用户名”)->结束()->scalarNode (“密码”)->结束()->结束()->结束()->结束()->结束();
原型可用于添加定义,该定义可在当前节点内重复多次。根据上面示例中的原型定义,可以有多个连接数组(包含一个司机
,宿主
等)。
有时,为了改善应用程序或包的用户体验,可以允许在需要数组值的地方使用简单的字符串或数值。使用castToArray ()
Helper将这些变量转换为数组:
1 2 3 4
->arrayNode (“主机”)->beforeNormalization ()->castToArray ()->结束()/ /……->结束()
阵列节点选项
在定义数组节点的子节点之前,你可以提供如下选项:
-
useAttributeAsKey ()
- 提供子节点的名称,其值应用作结果数组中的键。此方法还定义了配置数组键的处理方式,如下面的示例所解释。
-
requiresAtLeastOneElement ()
-
数组中至少有一个元素(仅当
isRequired ()
也被称为)。 -
addDefaultsIfNotSet ()
- 如果任何子节点具有默认值,则在没有提供显式值时使用它们。
-
normalizeKeys(假)
-
如果调用(用
假
),带破折号的键是不规范化为下划线。建议在用户将定义键-值映射的原型节点中使用这种方法,以避免不必要的转换。 -
ignoreExtraKeys ()
- 允许在数组下指定额外的配置键而不抛出异常。
一个基本的原型阵列配置可以定义如下:
1 2 3 4 5 6 7 8
$节点->fixXmlConfig (“司机”)->孩子()->arrayNode (“司机”)->scalarPrototype ()->结束()->结束()->结束();
当使用以下YAML配置时:
1
司机:(“mysql”,“sqlite”]
或以下XML配置:
1 2
<司机>mysql司机><司机>sqlite司机>
处理后的配置为:
1 2 3 4
数组([0] = >“mysql”[1] = >“sqlite”)
一个更复杂的例子是定义一个带有子元素的原型数组:
12 3 4 5 6 7 8 9 10 11 12 13 14
$节点->fixXmlConfig (“连接”)->孩子()->arrayNode (“连接”)->arrayPrototype ()->孩子()->scalarNode (“表”)->结束()->scalarNode (“用户”)->结束()->scalarNode (“密码”)->结束()->结束()->结束()->结束()->结束();
当使用以下YAML配置时:
1 2 3
连接:-{表:ob娱乐下载symfony,用户:根,密码:~}-{表:foo,用户:根,密码:pa $ $}
或以下XML配置:
1 2
<连接表格=“ob娱乐下载symfony”用户=“根”密码=“零”/><连接表格=“foo”用户=“根”密码=“pa $ $”/>
处理后的配置为:
12 3 4 5 6 7 8 9 10 11 12
数组([0] = >数组([table] => .sob娱乐下载ymfony的[用户]= >“根”(密码)= >零) [1] = >数组([table] => .“foo”[用户]= >“根”(密码)= >“爸爸$ $”) )
前面的输出与预期的结果匹配。然而,给定配置树,当使用以下YAML配置时:
1 2 3 4 5 6 7 8 9
连接:sf_connection:表:ob娱乐下载用户:根密码:~默认值:表:喷火用户:根密码:pa $ $
输出配置将与之前完全相同。换句话说,sf_connection
而且默认的
配置密钥丢失。原因是Symfony Config组件默认将数ob娱乐下载组视为列表。
请注意
在撰写本文时,存在一个不一致的地方:如果只有一个文件提供有问题的配置,则密钥(即。sf_connection
而且默认的
)不丢失。但是如果有多个文件提供配置,密钥就会丢失,如上所述。
为了维护数组键,使用useAttributeAsKey ()
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
$节点->fixXmlConfig (“连接”)->孩子()->arrayNode (“连接”)->useAttributeAsKey (“名字”)->arrayPrototype ()->孩子()->scalarNode (“表”)->结束()->scalarNode (“用户”)->结束()->scalarNode (“密码”)->结束()->结束()->结束()->结束()->结束();
请注意
在YAML中,“名字”
的观点useAttributeAsKey ()
具有特殊含义,指的是地图的键(sf_connection
而且默认的
在这个例子中)。属性定义了子节点连接
带有键的节点的名字
,那么地图的钥匙就会丢失。
此方法的参数(的名字
(在上面的例子中)定义添加到每个XML节点以区分它们的属性的名称。现在您可以使用前面显示的相同YAML配置或以下XML配置:
1 2 3 4
<连接的名字=“sf_connection”表格=“ob娱乐下载symfony”用户=“根”密码=“零”/><连接的名字=“默认”表格=“foo”用户=“根”密码=“pa $ $”/>
在这两种情况下,处理后的配置都会维护sf_connection
而且默认的
密钥:
12 3 4 5 6 7 8 9 10 11 12
数组([sf_connection] => .数组([table] => .sob娱乐下载ymfony的[用户]= >“根”(密码)= >零) [默认的] = >数组([table] => .“foo”[用户]= >“根”(密码)= >“爸爸$ $”) )
默认值和必需值
对于所有节点类型,都可以定义默认值和替换值,以防节点具有某个值:
-
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 (“价值”)->结束()->结束()->结束()->结束();
弃用选项
5.1
签署setDeprecated ()
方法从setDeprecated (?字符串消息)美元
来setDeprecated(字符串$package,字符串$version, ?字符串$message)
在Syob娱乐下载mfony 5.1。
属性可以弃用选项setDeprecated ()方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
$rootNode->孩子()->integerNode (“old_option”)//输出以下通用弃用消息://由于acme/package 1.2:路径“…”处的子节点“old_option”已弃用。->setDeprecated (“acme /包”,“1.2”)//你也可以传递一个自定义弃用消息(%node%和%path%占位符可用):->setDeprecated (“acme /包”,“1.2”,“%node%”选项已弃用。请使用“new_config_option”。)->结束()->结束();
如果使用Web调试工具栏,在重新构建配置时将显示这些弃用通知。
记录选项
方法记录所有选项信息()方法:
1 2 3 4 5 6 7 8
$rootNode->孩子()->integerNode (“entries_per_page”)->信息(“此值仅用于搜索结果页面。”)->defaultValue (25)->结束()->结束();
属性转储配置树时,该信息将作为注释打印配置:dump-reference
命令。
在YAML中你可能有:
1 2
此值仅用于搜索结果页面。entries_per_page:25
XML格式:
1 2
<!--entries-per-page:This value is only used for the search results page. --><配置entries-per-page=“25”/>
可选部分
如果您有整个可选的部分,可以启用/禁用,您可以利用这个快捷方式canBeEnabled ()而且canBeDisabled ()方法:
12 3 4 5 6 7 8 9 10 11 12 13 14
$arrayNode->canBeEnabled ();//等价于$arrayNode->treatFalseLike ([“启用”=>假])->treatTrueLike ([“启用”=>真正的])->treatNullLike ([“启用”=>真正的])->孩子()->booleanNode (“启用”)->defaultFalse ();
的canBeDisabled ()
方法看起来大致相同,只是该部分将在默认情况下启用。
合并选项
可能会提供关于合并过程的额外选项。数组:
-
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
公共函数getConfigTreeBuilder(){$treeBuilder=新TreeBuilder (“数据库”);$treeBuilder->getRootNode ()->孩子()->arrayNode (“连接”)->孩子()->scalarNode (“司机”)->isRequired ()->cannotBeEmpty ()->结束()->scalarNode (“主机”)->defaultValue (“localhost”)->结束()->scalarNode (“用户名”)->结束()->scalarNode (“密码”)->结束()->booleanNode (“记忆”)->defaultFalse ()->结束()->结束()->追加($这->addParametersNode ())->结束()->结束();返回$treeBuilder;}公共函数addParametersNode(){$treeBuilder=新TreeBuilder (“参数”);$节点=$treeBuilder->getRootNode ()->isRequired ()->requiresAtLeastOneElement ()->useAttributeAsKey (“名字”)->arrayPrototype ()->孩子()->scalarNode (“价值”)->isRequired ()->结束()->结束()->结束();返回$节点;}
如果配置的部分在不同的地方重复,这也有助于避免重复。
该示例的结果如下:
- YAML
- XML
12 3 4 5 6 7 8 9 10 11 12
数据库:连接:司机:~#需要主持人:本地主机用户名:~密码:~记忆:假参数:#需要#原型名称:值:~#需要
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<数据库><!--司机:Required --><连接司机=""宿主=“localhost”用户名=""密码=""内存=“假”><!--prototype --><!--值:Required --><参数的名字=“参数名称”价值=""/>连接>数据库>
归一化
在处理配置文件时,首先对它们进行规范化,然后合并,最后使用树来验证生成的数组。规范化过程用于去除由不同配置格式引起的一些差异,主要是YAML和XML之间的差异。
键中使用的分隔符通常为_
在YAML和-
在XML。例如,auto_connect
在YAML和auto-connect
在XML。归一化会得到这两个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 (“扩展”)->scalarPrototype ()->结束()->结束()->结束();
如果它是一个不规则的复数形式,你可以指定复数形式作为第二个参数:
1 2 3 4 5 6 7 8
$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 ()
ifEmpty ()
(从Symfoob娱乐下载ny 3.2开始)ifArray ()
ifInArray ()
ifNotInArray ()
总是()
验证规则还需要“then”部分:
然后()
thenEmptyArray ()
thenInvalid ()
thenUnset ()
通常,"then"是一个闭包。它的返回值将用作节点的新值,而不是节点的原始值。
配置节点路径分隔符
考虑以下配置构建器示例:
1 2 3 4 5 6 7 8 9 10 11
$treeBuilder=新TreeBuilder (“数据库”);$treeBuilder->getRootNode ()->孩子()->arrayNode (“连接”)->孩子()->scalarNode (“司机”)->结束()->结束()->结束()->结束();
默认情况下,配置路径中的节点层次结构是用点字符(.
):
1 2 3 4 5 6 7
/ /……$节点=$treeBuilder->buildTree ();$孩子们=$节点->调用getChildren ();$childChildren=$孩子们[“连接”]->调用getChildren ();$路径=$childChildren[“司机”]->getPath ();// $path = 'database.connection.driver'
使用setPathSeparator ()
方法更改路径分隔符:
1 2 3 4 5 6 7 8
/ /……$treeBuilder->setPathSeparator (' / ');$节点=$treeBuilder->buildTree ();$孩子们=$节点->调用getChildren ();$childChildren=$孩子们[“连接”]->调用getChildren ();$路径=$childChildren[“司机”]->getPath ();// $path = '数据库/连接/驱动程序'
处理配置值
的处理器方法构建树时使用该树TreeBuilder处理应合并的配置值的多个数组。如果任何值不是预期的类型,是强制的,但未定义,或者不能以其他方式验证,则会抛出异常。否则,结果是一个干净的配置值数组:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用Acme\DatabaseConfiguration;使用ob娱乐下载\组件\配置\定义\处理器;使用ob娱乐下载\组件\Yaml\Yaml;$配置= Yaml::解析函数(__DIR__.' / src /马提亚/配置/ config.yaml '));$extraConfig= Yaml::解析函数(__DIR__.' / src /马提亚/配置/ config_extra.yaml '));$配置= ($配置,$extraConfig];$处理器=新处理器();$databaseConfiguration=新DatabaseConfiguration ();$processedConfiguration=$处理器->processConfiguration ($databaseConfiguration,$配置);