我试图将一些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中正确连接?
答案 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')以允许标记。