symfony - 使配置节点在 Symfony 2 配置中同时支持字符串和数组?

标签 symfony configuration dependency-injection symfony-2.1

可以我的配置节点source两者都支持stringarray值(value)观?

采购自 string :

# Valid configuration 1
my_bundle:
    source: %kernel.root_dir%/../Resources/config/source.json

采购自 array :

# Valid configuration 2
my_bundle:
    source:
        operations: []
        commands: []

扩展类将能够区分它们:

if (is_array($config['source']) {
    // Bootstrap from array
} else {
    // Bootstrap from file
}

我可能会使用这样的东西:

$rootNode->children()
    ->variableNode('source')
        ->validate()
            ->ifTrue(function ($v) { return !is_string($v) && !is_array($v); })
            ->thenInvalid('Configuration value must be either string or array.')
        ->end()
    ->end()
->end();

但是我如何在 source 的结构上添加约束(操作、命令等...)到变量节点(只有在其值类型为 array 时才应该强制执行)?

最佳答案

我认为您可以通过重构扩展来使用配置规范化。

在您的扩展程序中更改您的代码以检查是否设置了路径

if ($config['path'] !== null) {
    // Bootstrap from file.
} else {
    // Bootstrap from array.
}

并允许用户使用字符串进行配置。
$rootNode
    ->children()
        ->arrayNode('source')
            ->beforeNormalization()
            ->ifString()
                ->then(function($value) { return array('path' => $value); })
            ->end()
            ->children()
                ->scalarNode('foo')
                // ...
            ->end()
        ->end()
    ->end()
;

像这样,您可以允许用户使用可以验证的字符串或数组。

symfony documentation for normalisation

希望它有帮助。
最良好的问候。

关于symfony - 使配置节点在 Symfony 2 配置中同时支持字符串和数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15922243/

相关文章:

mysql - silex 将一个 SQL 语句循环到另一个 SQL 语句上

java - 如何通过URL访问XML文件

c++ - QT_VERSION 不正确?

c# - ConfigurationSection 与 IConfigurationSectionHandler

java - Spring 启动 : get command line argument within @Bean annotated method

php - Symfony2 登录后成功处理程序不工作

forms - 如何检查表格中的 Twig 是否有错误?

sql - 原则 2 使用 LIKE 进行查询

java - 从数据模型访问同级数据

c# - ASP.NET Core - DI - 使用 Action<T> 或 IOption<T>