我正在尝试将一些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中正确地接线?
似乎应用程序\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”)以允许标记。
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) {...}
默认情况下,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类