我执行这个命令
app/console container:debug | grep logger
Run Code Online (Sandbox Code Playgroud)
显然,有一个名为的服务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"
Run Code Online (Sandbox Code Playgroud)
我使用以下代码注入服务:
public function process(ContainerBuilder $container)
{
$clients= $container->findTaggedServiceIds('socket.client');
foreach ($clients as $id => $tags) {
$definition = $container->getDefinition($id);
$definition->addArgument($container->getDefinition('logger'));
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
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]
Run Code Online (Sandbox Code Playgroud)
我必须在代码中注入记录器服务的原因,因为我有几个 socket.client服务,并且它们在代码中定义.
我可以在appDevDebugProjectContainer.xml中找到记录器服务定义:
<service id="logger" class="Symfony\Bridge\Monolog\Logger">
<argument>app</argument>
<call method="pushHandler">
<argument type="service" id="monolog.handler.console"/>
</call>
<call method="pushHandler">
<argument type="service" id="monolog.handler.main"/>
</call>
<call method="pushHandler">
<argument type="service" id="monolog.handler.debug"/>
</call>
</service>
Run Code Online (Sandbox Code Playgroud)
即使我写了一个编译传递来注入记录器服务,它仍然无法正常工作
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);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么记录器服务如此特别?
您是否尝试过使用参考文献来代替?
$definition->addArgument(new Reference('logger'));
Run Code Online (Sandbox Code Playgroud)
此时该定义可能还不存在。您从未在参数中设置实际定义,而是设置对服务的引用。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |