symfony2 yaml:覆盖配置
我无法使symfony2配置正确覆盖其他配置文件中的值。问题是: 我有一个新的环境“staging”,在这里我想使用config_prod.yml中的大部分内容,但有另一个日志记录级别(我希望它与开发中的一样,只需将所有内容记录到一个文件中)。以下是我使用的配置: config_prod.yml:symfony2 yaml:覆盖配置,symfony,yaml,Symfony,Yaml,我无法使symfony2配置正确覆盖其他配置文件中的值。问题是: 我有一个新的环境“staging”,在这里我想使用config_prod.yml中的大部分内容,但有另一个日志记录级别(我希望它与开发中的一样,只需将所有内容记录到一个文件中)。以下是我使用的配置: config_prod.yml: imports: - { resource: config.yml } monolog: handlers: main: type: fing
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: ~
imports:
- { resource: config_prod.yml }
monolog:
handlers:
main:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
handler: ~
nested: ~
在我看来,嵌套记录器现在为null,并且主日志指向给定文件真正发生的是,他将每条消息记录两次当我将其用于config_staging.yml时,也会发生同样的情况:
imports:
- { resource: config_prod.yml }
monolog:
handlers:
main:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
nested: ~
imports:
- { resource: config_prod.yml }
monolog:
handlers:
main:
type: stream
path: %kernel.logs_dir%/%kernel.environment%.log
level: debug
handler: ~
nested: ~
我找到了一个解决方法,将主处理程序的action_级别设置为debug,并保留其他所有内容,但我不喜欢这个解决方案。必须有一种方法覆盖配置文件,所以我只有主monolog处理程序。检查\u staging config文件中没有任何重复的键——第二个会覆盖第一个,最终结果是第一个被忽略了。差不多一年后,我现在了解了正在发生的事情以及如何预防它:
嵌套的
处理程序被来自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\u prod.yml
等等。如果要通过删除元素来更改集合,则必须创建一个中间YAML文件(导入基文件),将集合设置为“null”以及在一个文件中重新添加所有必需的集合元素,从而导入中间YAML文件
不能简单地覆盖集合。新元素将被添加,但您不能删除现有元素,除非使用所述的解决方法。我选中了此元素,其中没有重复的键!