如何在Symfony中从编译器传入共享服务

时间:2017-09-08 12:18:40

标签: symfony dependency-injection

我试图通过编译器传递注入令牌存储服务,该传递旨在替换FOSRestBundle中的一个服务:

<?php

namespace App\Compiler;

use App\Event\Listener\RestParamConverter;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class RestParamConverterOverride implements CompilerPassInterface
{
    /**
     * You can modify the container here before it is dumped to PHP code.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $definition = $container->getDefinition('fos_rest.converter.request_body');
        $definition->setClass(RestParamConverter::class);
        $definition->addArgument($container->getDefinition('security.token_storage'));
    }
}

出于某种原因,即使安全系统正在TokenStorage中正确设置令牌,但在我访问TokenStorage时,在我的自定义服务中,$tokenStorage->getToken()似乎返回{{1} }}。我已经调试了代码,并确保在我尝试检索值之前验证正在运行。

我已经使用其他服务进行过测试,我看到了无论我注入null的行为。这很奇怪但是在编译器传递中它似乎创建了该服务的新实例而不是使用共享服务。

在其他部分,服务注入正常工作 - 只是不在这些编译器传递中。任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

文档展示了如何注入对现有服务的引用,而不是创建服务的新实例:https://symfony.com/doc/current/components/dependency_injection.html#basic-usage

具体来说,使用:

$definition->addArgument(new Reference('service_name'))