我无法让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处理程序。
答案 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文件。
您不能简单地覆盖集合。将添加新元素,但除了所描述的解决方法之外,您无法删除现有元素。