Symfony config.yml - 如何通过名称传递构造函数参数?

3

我正试图在Symfony WebApp中使用自定义格式化程序来创建Monlog日志条目:

//config.yml
services:
    monolog.formatter.extended:
        class: Monolog\Formatter\LineFormatter
        arguments:
            format: "[%%datetime%%] %%channel%%.%%level_name%% ...\n\n"
            allowInlineLineBreaks: true
            ignoreEmptyContextAndExtra: true
        calls:
            - [includeStacktraces]

所有使用该格式器创建的日志条目都以[1]...开头,而不是插入正确的时间戳[2015-12-16 10:40:23]...
当我删除两个额外的参数allowInlineLineBreaksignoreEmptyContextAndExtra时,此问题不会出现。
arguments:
    format: "[%%datetime%%] %%channel%%.%%level_name%% ...\n\n"

然而,当我不通过名称传递参数,而只是将它们作为完整列表传递时,一切正常运行。 LineFormatter 构造函数如下所示:
public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false) { ...}

因此,将参数作为列表添加可以正常工作:

 arguments:
    - "[%%datetime%%] %%channel%%.%%level_name%% ...\n\n"
    - null
    - true
    - true

传递参数时使用名称有什么问题吗?我在几个示例中看到了这种用法,但显然我在使用方式上存在问题?
1个回答

2
说实话,我从未见过使用键来注入参数。我知道当处理参数或使用setter进行注入时可以使用键,就像文档所说的那样: http://symfony.com/doc/current/book/service_container.html#optional-dependencies-setter-injection 如果您想使用setter进行注入,可以这样做:
//config.yml
services:
    some.service.name:
        class: SomeClass
        calls:
            - [setFormat, "[%%datetime%%] %%channel%%.%%level_name%%"]

但是Monolog LineFormatter不支持这种方式。

最终我认为您会选择常见的数组模式。

希望这可以帮到您,如果您有一些展示使用键的示例文档,我很想看看,然后我们可以讨论!


谢谢你的回答!我在不同的例子中看到了这种参数按名称的风格(例如http://www.petethompson.net/blog/symfony/2015/03/15/symfony-logging-client-ip/和https://dev59.com/WWgu5IYBdhLWcg3wAici#11654384),并认为它是有效的语法。但你是对的,我找不到任何使用这种风格的文档。奇怪。 - Andrei Herford
1
似乎依赖注入器只考虑值,因此如果您使用名称并保持顺序,则可以,但是如果您尝试更改顺序,则它也会以错误的顺序注入。我还研究了一些内部情况,似乎键仅在需要替换参数的情况下使用。 - Renato Mefi
谢谢你的提示,这很有道理。由于dateFormat是第二个参数,当“true”(或其他无效的值)作为第二个参数传递时,无论使用什么名称都无法正常工作。 - Andrei Herford

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