我正在使用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时,它的改进没有注册到它,因为核心没有实现。
谢谢。
答案 0 :(得分:3)
除了设计问题之外,实例化服务的最简单方法是使用an event listener。在您的情况下,您将听取kernel.request
并从容器中提取服务。
class RequestListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$event->getKernel()->getContainer()->get('service_id');
}
}