我希望在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
我不知道为什么很难重写服务。
答案 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。