我正在尝试将一些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 回答
似乎
App\Util\MonologDBHandler
可能是唯一积极使用monolog.logger.db
- 通过container->get('...')
调用 . (如果没有,您将希望使用此技术将特定类型的 Logger 标记为更多服务) .您最好允许框架自己构建
app.monolog.db_handler
服务,并使用容器来帮助构建它 . 通常,要注入 Logger 服务,您只需要键入提示:但是,默认情况下,这将使用默认
@logger
进行设置,因此您需要在希望different type of logger的处理程序的服务定义中添加额外提示:现在,
CustomLogger
中的 Logger 应该是您以前称为monolog.logger.db
的 Logger .您还可以使用不同的接口(类似于LoggerInterface如何别名以注入'@logger')来允许标记 .
Alister的答案是一个良好的开端,但您可以利用服务参数绑定而不是为每个 Logger 创建新服务:
然后只需更改类中的参数名称:
默认情况下所有services in Symfony 4 are private(并且是推荐的实践)所以你需要在每个Controller中"inject"每个需要的服务(我个人使用自定义的CommonControllerServiceClass) .
您也可以创建一个公共service "alias"来继续访问该服务,但这不是最好的实践(也因为我猜你还有很多其他服务需要修复) .
然后你可以从容器中获取服务: