首页 文章

monolog.logger.db服务已被删除

提问于
浏览
1

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

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

编译容器时,“monolog.logger.db”服务或别名已被删除或内联 . 您应该将其公开,或者直接停止使用容器并使用依赖注入 .

我的日志代码:

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

Monolog配置:

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

app.monolog.db_handler config(注意,我在这里尝试了 public: true 并且没有任何影响:

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

如何才能在Symfony 4中正确连接?

3 回答

  • 2

    似乎 App\Util\MonologDBHandler 可能是唯一积极使用 monolog.logger.db - 通过 container->get('...') 调用 . (如果没有,您将希望使用此技术将特定类型的 Logger 标记为更多服务) .

    您最好允许框架自己构建 app.monolog.db_handler 服务,并使用容器来帮助构建它 . 通常,要注入 Logger 服务,您只需要键入提示:

    // 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 中的 Logger 应该是您以前称为 monolog.logger.db 的 Logger .

    您还可以使用不同的接口(类似于LoggerInterface如何别名以注入'@logger')来允许标记 .

  • 1

    Alister的答案是一个良好的开端,但您可以利用服务参数绑定而不是为每个 Logger 创建新服务:

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

    然后只需更改类中的参数名称:

    // in App\Util\MonologDBHandler.php 
    
    use Psr\Log\LoggerInterface;
    
    public function __construct(LoggerInterface $databaseLogger = null) {...}
    
  • 1

    默认情况下所有services in Symfony 4 are private(并且是推荐的实践)所以你需要在每个Controller中"inject"每个需要的服务(我个人使用自定义的CommonControllerServiceClass) .

    您也可以创建一个公共service "alias"来继续访问该服务,但这不是最好的实践(也因为我猜你还有很多其他服务需要修复) .

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

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

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

相关问题