如何在Symfony 4中公开LoggerInterface服务

FreeLightman

我希望Psr\Log\LoggerInterface在symfony中公开,以便能够使用来直接从容器中获取它$container->get('Psr\Log\LoggerInterface')

我尝试了以下方法services.yaml

_defaults:
 public: true

Psr\Log\LoggerInterface:
 public: true

Psr\Log\LoggerInterface:
 alias: 'logger'
 public: true

Psr\Log\LoggerInterface:
 alias: 'monolog.logger'
 public: true

我不知道为什么很难重写服务。

塞拉德

如前所述,不建议从容器直接访问服务。但是我很好奇如何公开私有服务。我尝试了问题中列出的内容,并确认它不起作用。

这可能不是最简单的方法,但是编译器可以解决问题:

# src/Kernel.php
# Make the kernel a compiler pass
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
class Kernel extends BaseKernel implements CompilerPassInterface
...
public function process(ContainerBuilder $container)
{
    $logger = $container->getAlias(LoggerInterface::class);
    $logger->setPublic(true);
}

# And that should do the trick, you can confirm with
bin/console debug:container Psr\Log\LoggerInterface

请注意,只有注入了完整容器的服务才可以利用这一点。从AbstractController扩展的控制器只能访问少量服务。

如果您需要控制器中的记录器,或者只是想要“更好”的方式,请看一下Service Subscribers

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章