定义和处理配置值
编辑该页面定义和处理配置值
验证配置值
从各种各样的资源加载配置值后,可以验证值和它们的结构使用的“定义”部分配置组件。配置值通常会表现出一定的层次结构。某种类型的值应该也被限制在数量或一个给定的一组值中的一个。例如,下面的配置(YAML)显示了一个清晰的层次结构和一些验证规则,应该应用(如:”的值auto_connect
必须是一个布尔值”):
1 2 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:
1 2 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
。总的来说:定义一个节点后,调用结束()
带你一步的层次结构。
节点类型
可以验证提供的值的类型,通过使用适当的节点定义。节点类型可用于:
- 标量(泛型类型,包括布尔值、字符串、整数、浮点数和
零
) - 布尔
- 整数
- 浮动
- 枚举(类似于标量,但只允许一组有限的值)
- 数组
- 变量(没有验证)
和创建节点(名称、类型)美元
或其关联的快捷方式xxxxNode(名称)
方法。
数字节点约束
数字节点(浮点数和整数),提供两个额外的约束min ()和max ()——允许验证值:
1 2 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 (“交付”)- >值((“标准”,“加速”,“优先”])- >结束()- >结束();
这将限制交付
选项是标准
,加快
或优先级
。
你也可以提供枚举值enumNode ()
。让我们来定义一个枚举可能状态的描述上面的例子:
1 2 3 4 5 6
字符串枚举交付:{情况下标准=“标准”;情况下加快=“加速”;情况下优先级=“优先”;}
配置现在可以这样写:
1 2 3 4 5 6 7 8 9 10
美元rootNode- >孩子()- >enumNode (“交付”)/ /你可以提供所有的枚举值……- >值(交付::例())/ /……或者你可以下其他标量值传递只有一些值- >值([交付::优先级、交付::标准,“其他”,假])- >结束()- >结束();
6.3
枚举值的支持enumNode ()
是在Symfony 6.3中引入的。ob娱乐下载
数组节点
可以添加一个更深层次的层次结构,通过添加一个节点数组。数组节点本身,可能有一组预定义的变量节点:
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 14
美元rootNode- >孩子()- >arrayNode (“连接”)- >arrayPrototype ()- >孩子()- >scalarNode (“司机”)- >结束()- >scalarNode (“主机”)- >结束()- >scalarNode (“用户名”)- >结束()- >scalarNode (“密码”)- >结束()- >结束()- >结束()- >结束()- >结束();
原型可以用于添加一个定义在当前节点可能会重复很多次了。根据原型定义在上面的示例中,可以有多个连接数组(包含一个司机
,主机
等)。
有时,来提高应用程序的用户体验或包,你可能允许使用一个简单的字符串或数值数组值是必需的。使用castToArray ()
助手将这些变量转化为数组:
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”)
一个更复杂的例子是定义一个有孩子的原型数组:
1 2 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 $ $”/ >
处理配置是:
1 2 3 4 5 6 7 8 9 10 11 12
数组([0)= >数组((表)= >sob娱乐下载ymfony的[用户]= >“根”(密码)= >零)[1)= >数组((表)= >“foo”[用户]= >“根”(密码)= >“爸爸$ $”))
前面的输出匹配预期的结果。然而,考虑到配置树,当使用YAML配置如下:
1 2 3 4 5 6 7 8 9
连接:sf_connection:表:ob娱乐下载用户:根密码:~默认值:表:喷火用户:根密码:pa $ $
输出配置之前一模一样。换句话说,sf_connection
和默认的
配置钥匙丢失。原因是Symfony的配置组件将数组作为默认列ob娱乐下载表。
请注意
写这篇文章,有一个矛盾:如果只有一个文件提供了配置问题,钥匙(即。sf_connection
和默认的
)不丢失。但如果不止一个文件提供了配置,钥匙丢失如上所述。
为了保持数组键使用useAttributeAsKey ()
方法:
1 2 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
和默认的
密钥:
1 2 3 4 5 6 7 8 9 10 11 12
数组([sf_connection] = >数组((表)= >sob娱乐下载ymfony的[用户]= >“根”(密码)= >零)[默认的)= >数组((表)= >“foo”[用户]= >“根”(密码)= >“爸爸$ $”))
违约和所需的值
对于所有的节点类型,可以定义默认值和替换值一个节点有一定的价值:
-
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 (“价值”)- >结束()- >结束()- >结束()- >结束();
不以为然的选择
你可以反对使用的选项setDeprecated ()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
美元rootNode- >孩子()- >integerNode (“old_option”)/ /这个输出以下通用弃用信息:/ / acme /包1.2以来:子节点“old_option”路径是弃用“…”。- >setDeprecated (“acme /包”,“1.2”)/ /你还可以通过一个定制的弃用消息路径节点(% %和% %占位符可用):- >setDeprecated (“acme /包”,“1.2”,节点的“% %”选项是弃用。用“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. -->< /span><配置entries-per-page=“25”/ >
可选部分
如果你有整个部分是可选的,可以启用/禁用,您可以利用的捷径canBeEnabled ()和canBeDisabled ()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元arrayNode- >canBeEnabled ();/ /相当于美元arrayNode- >treatFalseLike ([“启用”= >假])- >treatTrueLike ([“启用”= >真正的])- >treatNullLike ([“启用”= >真正的])- >孩子()- >booleanNode (“启用”)- >defaultFalse ();
的canBeDisabled ()
方法看起来差不多,除了部分是默认启用。
合并选项
关于合并过程可能会提供额外的选项。数组:
-
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
公共函数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 ()- >结束()- >结束()- >结束();返回美元节点;}
这也有助于你避免重复配置的如果你有部分重复在不同的地方。
结果在以下例子:
1 2 3 4 5 6 7 8 9 10 11 12
数据库:连接:司机:~#需要主持人:本地主机用户名:~密码:~记忆:假参数:#需要#原型名称:值:~#需要
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<数据库>< !- - - - - -- - - - - -司机:Required -->< /span><连接司机=”“主机=“localhost”用户名=”“密码=”“内存=“假”>< !- - - - - -- - - - - -prototype -->< /span>< !- - - - - -- - - - - -值:Required -->< /span><参数的名字=“参数名称”价值=”“/ >< /连接>< /数据库>
归一化
当他们第一次规范化的处理配置文件,然后合并,最后树用于验证结果数组中。正常化过程用于删除的一些差异源于不同的配置格式,主要是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
通过改变一个字符串值到一个关联数组的名字
的关键:
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 ()
ifEmpty ()
ifArray ()
ifInArray ()
ifNotInArray ()
总是()
一个验证规则也需要一个“然后”部分:
然后()
thenEmptyArray ()
thenInvalid ()
thenUnset ()
通常,“然后”是一个闭包。其返回值将被用作一个新值的节点,而不是节点的原始值。
配置节点路径分隔符
考虑以下配置构建器的例子:
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 ();/ /路径美元= ' database.connection.driver '
使用setPathSeparator ()
方法配置构建器改变路径分隔符:
1 2 3 4 5 6 7 8
/ /……美元treeBuilder- >setPathSeparator (' / ');美元节点=美元treeBuilder- >buildTree ();美元孩子们=美元节点- >调用getChildren ();美元childChildren=美元孩子们(“连接”]- >调用getChildren ();美元路径=美元childChildren(“司机”]- >getPath ();/ / $ path =“数据库连接/驱动程序”
处理配置值
的处理器使用树因为它建成使用TreeBuilder处理多个阵列的配置值应该合并。如果没有预期的任何值类型,是强制性的,但未定义,或其他方式无法验证,就会抛出一个异常。否则,结果是一个干净的配置值的数组:
1 2 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,美元配置);