Symfony2的。强制服务获取实例

时间:2016-03-22 20:29:07

标签: php symfony containers

我正在使用symfony 2.8,我面临的情况是,即使某个地方没有请求服务,也必须实例化服务。

为什么?因为此Core服务配置通过调用Core的方法传输的标记服务(我在编译器传递中执行此操作)。 然后,如果我在没有请求Core的情况下请求其中一个标记服务,它将不会被配置然后无法使用。

这是编译器传递:

$coreDefinition = $container->findDefinition(
    'app.improvements.core'
);

$taggedAppliers = $container->findTaggedServiceIds('app.improvement.applier');

foreach ($taggedAppliers as $id => $tags) {
    $coreDefinition->addMethodCall(
        'registerApplier',
        [new Reference($id)]
    );
}

$taggedImprovements = $container->findTaggedServiceIds(
    'app.improvement'
);

// Only method found to initialize improvements.
foreach ($taggedImprovements as $id => $tags) {
    $coreDefinition->addMethodCall(
        'registerImprovement',
        [new Reference($id)]
    );
}

总之,Appliers注册了改进和核心寄存器Appliers。核心员工对应用程序的改进,因为每个改进必须在核心存储的特定应用程序中注册。

问题我当我只请求Applier时,它的改进没有注册到它,因为核心没有实现。

谢谢。

1 个答案:

答案 0 :(得分:3)

除了设计问题之外,实例化服务的最简单方法是使用an event listener。在您的情况下,您将听取kernel.request并从容器中提取服务。

class RequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $event->getKernel()->getContainer()->get('service_id');
    }
}