如何在Symfony 4中公开LoggerInterface服务

时间:2019-03-07 10:56:38

标签: symfony

我希望在Psr\Log\LoggerInterface中公开公开使用$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

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

2 个答案:

答案 0 :(得分:1)

使用 $ container-> get()是一种不好的做法。它违反了许多好的软件设计原则。

您应该改用构造函数注入。

class Foo
{
    protected $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}

答案 1 :(得分:1)

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

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

# 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