【发布时间】:2020-09-08 19:08:49
【问题描述】:
Symfony 文档有这样的描述(检查粗体部分):
加载多个配置文件时,应该可以 合并和覆盖一些值。其他值不应合并和 在第一次遇到时保持原样。 另外,有些键只有 当另一个键具有特定值时可用(在示例中 上面的配置:内存键只有在驱动时才有意义 是sqlite)。 https://symfony.com/doc/current/components/config/definition.html
这正是我所需要的。我想让一些配置只在特定条件下可用(并且需要)。但是在文档中没有示例或任何信息如何实现这样的事情。
示例 yaml:
my_bundle:
storages:
storage_name_1:
type: TYPE_A # Always required
connection: default # Always required
path: somepath # Required and available only if 'type' is TYPE_A
storage_name_2:
type: TYPE_B
connection: default
示例配置:
$rootNode
->children()
->arrayNode('storages')
->isRequired()
->requiresAtLeastOneElement()
->useAttributeAsKey('name')
->arrayPrototype()
->children()
->enumNode('type')
->values(['TYPE_A', 'TYPE_B'])
->isRequired()
->cannotBeEmpty()
->end()
->scalarNode('connection')->isRequired()->end()
->scalarNode('path')->isRequired()->end() // This should be required AND available only if type is TYPE_A. TYPE_B should not have this parameter.
->end()
->end()
->end()
->end();
【问题讨论】:
-
目前,我知道你可以为路径设置一个默认值
-
我认为这可能是一种误解;
memory键在不是sqlite时具有默认值。向下查看memory的页面,您会看到->booleanNode('memory')->defaultFalse()。他们指的是memory键本身是可选的(默认为false)。 -
我不知道如何以这种方式误解“某些键仅在另一个键具有特定值时可用”。这当然并不意味着“某些键可以具有默认值并且可以省略”。
-
考虑尝试 Slack Symfony 频道(来自 Symfony 社区)页面或深呼吸,看看其他捆绑包是如何做到的。配置树不适合胆小的人。
-
并不是说它的措辞很好,但似乎表明该配置不需要
memory键用于除父级sqlite之外的任何内容,因此可以默认设置(例如,可能是 @ 987654332@) 并且有人不必包含并非总是需要的内容。我认为你需要一个带有配置行/父访问权限的回调或重新排列它,所以它本质上更像mysql、sqlite(TYPE_A: ...),并且可以在未设置时默认设置。