Symfony2 YAML: 覆盖配置

7

我无法让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个回答

10

大约一年后,我现在理解了正在发生的事情以及如何防止它:

nested处理程序中填充了来自config.yml的配置,当解析config_staging.yml时,yaml组件不会覆盖整个哈希映射并将值设置为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

请检查您的_staging配置文件中是否有重复的键--第二个将覆盖第一个,导致第一个被忽略。


我检查了一下,里面没有重复的键! - Sgoettschkes

0

如果您想通过删除元素来更改集合,则必须创建一个中间的YAML文件(导入基本文件),将集合设置为“null”,并在另一个文件中重新添加所有所需的集合元素,该文件再次导入中间的YAML文件。

您不能简单地覆盖集合。新元素将被添加,但除非使用上述解决方法,否则无法删除现有元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接