如何在symfony 4中公开LoggerInterface服务

qaxu7uf2  于 2023-05-23  发布在  其他
关注(0)|答案(3)|浏览(109)

我想让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

我不明白为什么重写一个服务是如此困难。

5n0oy7gb

5n0oy7gb1#

如前所述,不鼓励直接从容器访问服务。但我有点好奇,想知道如何将私人服务公之于众。我尝试了问题中列出的方法,并确认它不起作用。
这可能不是最简单的方法,但编译器传递可以做到这一点:

# 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扩展的控制器只能访问少量的服务。
如果您需要在控制器中使用日志记录器,或者您只是想要一种“更好”的方式来完成此操作,请查看服务订阅者。

czq61nw1

czq61nw12#

我不确定这对您的情况是否有帮助,但在我的情况下,我需要在测试中使用monolog.logger服务的公共版本来模拟它。所以我创建了一个公共别名:

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

现在,当我使用带有LoggerInterface类的DI注入这个服务时,我得到了这个服务,我在测试中模拟了这个服务:

$loggerMock = $this->createMock(LoggerInterface::class);
static::getContainer()->set("test.monolog.logger", $loggerMock);
4nkexdtk

4nkexdtk3#

使用**$container->get()**是一种不好的做法。它违反了许多好的软件设计原则。
你应该使用构造函数注入。

class Foo
{
    protected $logger;

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

相关问题