【问题标题】:Where does the "@logger" service come from in a Symfony application?Symfony 应用程序中的“@logger”服务来自哪里?
【发布时间】:2014-07-29 10:51:29
【问题描述】:

我的app/config/services.yml

services:
  FooService:
    class: path/to/FooService.php
    arguments: [..., "@logger"]

我的FooService.php

class FooService
{
    public function __construct(..., $logger) {
        // $logger here satisfies \Psr\Log\LoggerInterface
    }
    ...
}

我不明白作为$logger 参数传入的LoggerInterface 实例实际上是从哪里来的。 Symfony 文档说(替换我的示例名称):

在 YAML 中,特殊的 @logger 语法告诉容器查找名为 logger 的服务并将该对象传递给 FooService 的构造函数。但是,在这种情况下,指定的服务logger 必须存在。如果没有,就会抛出异常。

显然logger 服务确实 存在,因为没有抛出异常并且我得到一个对象作为$logger 参数。但它来自哪里?在文档中的所有示例以及我的应用程序中,此语法似乎引用了services.yml 中定义的另一个服务。必须在其他地方定义服务,但文档没有说明在哪里。有什么线索吗?

【问题讨论】:

  • 它可以定义在你在内核中注册的包中。那些也可以有自定义 services.yml 文件
  • 捆绑包中有一堆由 Symfony 预先定义的服务 (github.com/symfony/symfony/tree/master/src/Symfony/Bundle)。要查看所有已注册的服务,您可以使用app/console container:debug

标签: php symfony logging service


【解决方案1】:

供应商/symfony/monolog-bundle/Symfony/Bundle/MonologBu​​ndle/Resources/config/monolog.xml

请注意,logger 实际上是 monolog.logger 的别名。您可以编写自己的记录器包来替代独白包。

追踪这类事情的一种方法是搜索 DependencyInjection\Configuration.php 文件中的参数集合,例如“monolog”。

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2014-04-03
    • 2020-02-28
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多