【问题标题】:How to merge imported config with environment config using Symfony Config as standalone component?如何使用 Symfony Config 作为独立组件将导入的配置与环境配置合并?
【发布时间】:2018-01-10 13:37:03
【问题描述】:

我正在将 symfony/config (v3.3) 作为独立组件集成到旧项目中。

除了配置处理器没有将继承/导入的配置config.yml 与环境配置config_<ENV>.yml 合并(正如我所期望的那样)之外,一切都很顺利。

调用$container->getExtensionConfig('whatever_node') 时,结果数组并没有得到合并的配置,而是包含两个配置。

编辑 1

事实证明,导入parameters.yml 来替换配置参数效果不佳(即在配置文件中使用%parameter_key%)。

编辑 2

以下是有关dev 环境的完整配置示例:

# parameters.yml
parameters:
    app_some_parameter_1: 'Some value for parameter 1'
    app_some_parameter_2: 'Another value for that second parameter'
# config.yml
imports:
    - { resource: parameters.yml }

app:
    some_parameter_1: '%app_some_parameter_1%'
    some_parameter_2: '%app_some_parameter_2%'
# config_dev.yml
imports:
    - { resource: config.yml }

app:
    some_parameter_2: 'Parameter 2 value in the dev environment'

最终的预期配置:

[
    "some_parameter_1" => "Some value for parameter 1",
    "some_parameter_2" => "Parameter 2 value in the dev environment"
]

我得到了什么:

[
  [
    "some_parameter_1" => "%app_some_parameter_1%",
    "some_parameter_2" => "%app_some_parameter_2%"
  ],
  [
    "some_parameter_2" => "Parameter 2 value in the dev environment"
  ]
]

【问题讨论】:

  • 你尝试使用 %kernel.environment% 吗?可能是这样的:config_ %kernel.environment%.yml ?
  • 不是这里的问题。
  • “两个配置”是什么意思?你能分享一个配置文件的例子,你得到的配置和你期望的配置吗?
  • 这是@MatTheCat(见编辑2)。

标签: php symfony


【解决方案1】:

事实上,从容器中检索到的数组ExtensionConfig(注意:我在这里说的是一个“模拟”容器,而不是由普通 Symfony 应用程序构建的容器)尚未处理。

要获得合并后的配置,您需要使用自己的扩展和配置对其进行处理:

# Acme/DependencyInjection/AcmeExtension.php
namespace Acme\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

class AcmeExtension extends Extension
{
    /**
     * @param array $configs
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
     *
     * @return array
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $resolvedConfigs = [];

        foreach ($configs as $config) {
            $resolvedConfigs[] = $container->getParameterBag()->resolveValue($config);
        }

        return $this->processConfiguration(new Configuration(), $resolvedConfigs);
    }
}
# Acme/DependencyInjection/Configuration.php
namespace Acme\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    /**
     * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('acme');

        $rootNode
            ->children()
                # ...
            ->end()
        ;

        return $treeBuilder;
    }
}

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2010-12-13
    • 2019-01-11
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多