繁体   English   中英

Symfony2的。 强制服务获取实例

[英]Symfony2. Force a service to get instanced

我正在使用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时,它的改进没有注册到它,因为核心没有实例化。

谢谢。

抛开设计问题,实例化服务的最简单方法是使用事件监听器 在您的情况下,您将侦听kernel.request并从容器中提取服务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM