monolog.logger.db 服务已删除

monolog.logger.db service has been removed

我正在尝试将一些 Symfony 3 代码重构为 Symfony 4。

尝试登录时出现以下错误:

The "monolog.logger.db" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the conta iner directly and use dependency injection instead.

我的日志代码:

$logger = $container->get('monolog.logger.db');
        $logger->info('Import command triggered');

独白配置:

monolog:
    channels: ['db']
    handlers:
        db:
            channels: ['db']
            type: service
            id: app.monolog.db_handler

app.monolog.db_handler 配置(注意,我在这里尝试了 public: true 但没有影响:

app.monolog.db_handler:
    class: App\Util\MonologDBHandler
    arguments: ['@doctrine.orm.entity_manager']

如何在 Symfony 4 中正确连接它?

默认全部services in Symfony 4 are private并且是推荐的做法)所以你需要"inject"在每个Controller中每个需要的服务(我个人使用自定义 CommonControllerServiceClass).

您也可以创建一个 public service "alias" 以像您一样继续访问该服务,但这不是最好的做法(还因为我猜您会有许多其他服务需要修复)。

mylogger.db:
    alias: monolog.logger.db
    public: true

然后就可以从容器中获取服务了:

$logger = $container->get('mylogger.db');

似乎 App\Util\MonologDBHandler 可能是唯一正在积极使用 monolog.logger.db 的东西 - 通过 container->get('...') 调用。 (如果没有,您将需要使用此技术将特定类型的记录器标记到更多服务中)。

你最好让框架自己构建app.monolog.db_handler服务,并使用容器来帮助构建它。通常,要注入记录器服务,您只需要 type-hint it:

// in App\Util\MonologDBHandler.php
use Psr\Log\LoggerInterface;

public function __construct(LoggerInterface $logger = null) {...}

但是,默认情况下,这将使用默认 @logger 进行设置,因此您需要在处理程序的服务定义中添加一个额外的提示,表明您需要 different type of logger:

services:
    App\Log\CustomLogger:
        arguments: ['@logger']
        tags:
            - { name: monolog.logger, channel: db }

现在,CustomLogger 中的记录器应该是您之前所知的 monolog.logger.db

您还可以为不同的接口设置别名(类似于 LoggerInterface 的别名以注入“@logger”)以允许标记。

Alister 的回答是一个好的开始,但您可以利用服务参数绑定而不是为每个记录器创建新服务:

services:
    _defaults:
        autowire: true
        bind:
            $databaseLogger: '@monolog.logger.db'

然后只需更改 class:

中的参数名称
// in App\Util\MonologDBHandler.php 

use Psr\Log\LoggerInterface;

public function __construct(LoggerInterface $databaseLogger = null) {...}