monolog.logger.db服务已被删除

时间:2018-03-05 09:57:30

标签: symfony symfony4

我试图将一些Symfony 3代码重构为Symfony 4.

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

  

" monolog.logger.db"服务或别名已被删除或内联   什么时候编译容器。你应该公开,或者   直接停止使用容器并使用依赖注入   代替。

我的日志代码:

.pbtxt

Monolog配置:

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

app.monolog.db_handler config(注意,我在这里尝试了monolog: channels: ['db'] handlers: db: channels: ['db'] type: service id: app.monolog.db_handler 并且没有任何影响:

public: true

如何在Symfony 4中正确连接?

3 个答案:

答案 0 :(得分:2)

默认情况下,所有services in Symfony 4 are private并且是推荐的实践),因此您需要"注入"在每个Controller中每个都需要服务(我个人使用自定义CommonControllerServiceClass )。

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

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

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

val (latitude, longitude) = when (type) {
  TYPEVALUES.MY_LOCATION -> Pair(0.0, 0.0)
  TYPEVALUES.CUSTOM_RADIUS -> Pair(1.0, 1.0)
  else -> Pair(2d, 2d)
}
//Your latitude is a double
//Your longitude is a double

答案 1 :(得分:2)

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

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

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

// in App\Util\MonologDBHandler.php 

use Psr\Log\LoggerInterface;

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

答案 2 :(得分:1)

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

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

// 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')以允许标记。