我希望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] 删除。
我来说两句