symfony2 yaml:覆盖配置

时间:2011-12-23 13:42:38

标签: symfony yaml

我无法让symfony2配置正确覆盖其他配置文件中的值。这是问题所在:

我有一个新的环境“staging”我想要使用来自config_prod.yml的大部分内容,但是有另一个日志记录级别(我希望它在开发过程中,只需将所有内容记录到文件中)。以下是我使用的配置内容:

config_prod.yml:

imports:
    - { resource: config.yml }

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            handler: nested
        nested:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug

config_staging.yml:

imports:
    - { resource: config_prod.yml }

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
        nested: ~

从我的角度来看,嵌套记录器现在为null,主记录到给定文件。 真正发生的是他将每条消息记录两次!当我将它用于config_staging.yml时会发生同样的情况:

imports:
    - { resource: config_prod.yml }

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            handler: ~
        nested: ~

我找到了一个解决方法,将主处理程序的action_level设置为debug并将其他所有内容保留原样,但我不喜欢这个解决方案。必须有一种方法来覆盖配置内容,所以我只有主要的monolog处理程序。

3 个答案:

答案 0 :(得分:8)

差不多一年后,我现在了解正在发生的事情以及如何防止它:

nested处理程序使用config.yml中的配置,并且在解析config_staging.yml时,yaml组件不会覆盖整个hashmap并将值设置为null但尝试合并两者,产生与以前相同的数组。

有一种名为null的类型,可用于覆盖任何记录器。它什么都不做,因此适用于这个用例:

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            handler: ~
        nested: ~
            type: null

另一种解决方案是不在config.yml中配置任何日志记录,而只在config_prod.yml等特定环境配置中配置。

答案 1 :(得分:1)

检查_staging配置文件中是否有任何重复的键 - 第二个键将覆盖第一个键,最终结果将忽略第一个键。

答案 2 :(得分:0)

如果要通过删除元素来更改集合,则必须创建中间YAML文件(导入基础),将集合设置为“null”并在文件中重新添加所有必需的集合元素,然后依次导入中间的YAML文件。

您不能简单地覆盖集合。将添加新元素,但除了所描述的解决方法之外,您无法删除现有元素。