当前位置: 首页 > 知识库问答 >
问题:

monolog.logger.db服务已被删除

黄意智
2023-03-14

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

我得到以下错误时,试图登录:

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

我的日志代码:

$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 config(注意,我在这里尝试了public:true,但没有影响:

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

我怎样才能在Symfony 4中正确地接线?

共有3个答案

姬翰林
2023-03-14

似乎应用程序\Util\MonologDBHandler可能是唯一积极使用monolog.logger.db的东西-通过容器-

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

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

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

但是,默认情况下,这将使用默认的@logger,因此您需要在处理程序的服务定义中添加一个额外的提示,说明您需要不同类型的记录器:

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

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

您还可以为另一个接口添加别名(类似于LoggerInterface的别名,以插入“@logger”)以允许标记。

朱季
2023-03-14

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) {...}
慎芷阳
2023-03-14

默认情况下,Symfony 4中的所有服务都是私有的(并且是推荐的做法),所以您需要在每个Controller中注入每个需要的服务(就我个人而言,我使用自定义的公共控制服务器服务类)。

您也可以创建一个公共服务别名来继续访问该服务,但这并不是最好的做法(也是因为我想你还有许多其他服务需要修复)。

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

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

$logger = $container->get('mylogger.db');
 类似资料:
  • 我们使用服务总线主题作为pub/sub系统的引擎。我们的逻辑涉及我们的NodeJS服务用多个订阅连接到一个主题。对于每个订阅,我们删除$default(TrueFilter),并在消息头的Label属性上创建一个CorrelationFilter,并且不在订阅中应用AutoDeleteOnIdle设置,因为我们希望确保订阅服务器功能在服务启动之前一直运行。 这个问题可以归结为这样:某件事能导致规则

  • 当Jenkins运行时,我删除了Jenkins源文件夹中的文件。 当我重新启动Jenkins服务时,它会给出错误: 所有正在运行的作业的配置文件都在那里 有什么方法可以启动Jenkins并重新配置它吗?

  • 问题内容: 启动应用程序时,我将执行API调用以查看是否有可用的新数据。数据存储在我的本地Realm数据库中,其中一些显示在初始表视图控制器中。 API调用完成后,我将检查是否满足某些条件,这些条件要求我从数据库中删除一堆先前的数据,然后创建新对象。但是,当我删除旧数据时,我的应用程序崩溃,但出现以下异常: 该调用堆栈让我假设,这是由于我在FavoriteLeaguesViewController

  • 在每个服务器上创建x会话后,我有2个不同的tomcat服务器(不同的机器),当我重新启动两个服务器时,其中一个保留会话,而另一个没有, -知道为什么吗?-我想和两只雄猫保持通话 谢谢

  • 我有一个由两个Symfony应用程序使用的库,该库定义了一组我希望公开的服务(我希望能够通过容器直接检索这些服务)。当我尝试访问一个服务时,我有: 编译容器时,已删除或内联库\Service\DerivedServices\OneSpecific实现"服务或别名。您应该将其公开,或者直接停止使用容器,转而使用依赖注入。 问题是,所述服务是公开的。 基本上有: 一个库\服务\BaseService类