我执行这个命令
app/console container:debug | grep logger
显然,有一个名为的服务logger
:
logger Symfony\Bridge\Monolog\Logger monolog.logger.assetic Symfony\Bridge\Monolog\Logger monolog.logger.doctrine Symfony\Bridge\Monolog\Logger monolog.logger.event Symfony\Bridge\Monolog\Logger monolog.logger.php Symfony\Bridge\Monolog\Logger monolog.logger.profiler Symfony\Bridge\Monolog\Logger monolog.logger.request Symfony\Bridge\Monolog\Logger monolog.logger.router Symfony\Bridge\Monolog\Logger monolog.logger.security Symfony\Bridge\Monolog\Logger monolog.logger.templating Symfony\Bridge\Monolog\Logger monolog.logger.translation Symfony\Bridge\Monolog\Logger swiftmailer.mailer.default.plugin.messagelogger Swift_Plugins_MessageLogger swiftmailer.plugin.messagelogger alias for "swiftmailer.mailer.default.plugin.messagelogger"
我使用以下代码注入服务:
public function process(ContainerBuilder $container) { $clients= $container->findTaggedServiceIds('socket.client'); foreach ($clients as $id => $tags) { $definition = $container->getDefinition($id); $definition->addArgument($container->getDefinition('logger')); } }
但我得到了这个错误:
Symfony\Component\DependencyInjection\Exception\InvalidArgumentException]服务定义"logger"不存在.
如果将logger
服务更改为monolog.logger.doctrine
,那么一切都很好,记录器服务发生了什么?
另一个有趣的事情是,即使上面的方法不起作用,它在yml中工作,我可以注入logger
服务
services: etc.socket.server: class: %etc.socket.server.class% arguments: [@logger, @event_dispatcher, @etc.encoder,@etc.message.client.request]
我必须在代码中注入记录器服务的原因,因为我有几个 socket.client
服务,并且它们在代码中定义.
我可以在appDevDebugProjectContainer.xml中找到记录器服务定义:
app
即使我写了一个编译传递来注入记录器服务,它仍然无法正常工作
public function process(ContainerBuilder $container) { $clients = $container->findTaggedServiceIds('micro_pay.socket.client'); foreach ($clients as $id => $tags) { $definition = $container->getDefinition($id); $loggerDefinition=$container->findDefinition('logger'); //$loggerDefinition is null // $definition->addArgument($loggerDefinition); } }
为什么记录器服务如此特别?