2016-03-22 4 views
1

Ich arbeite mit Symfony 2.8, ich stehe vor einer Situation, in der ein Dienst instanziiert werden muss, auch wenn er nicht irgendwo angefordert wird.Symfony2. Erzwinge einen Dienst, um instanziert zu werden

Warum? Weil dieser Core-Dienst getaggte Dienste konfiguriert, die durch einen Methodenaufruf in Core übertragen werden (ich habe dies in einem Compiler-Durchlauf getan). Und wenn ich dann einen dieser getaggten Dienste ohne Request Core anfordere, wird es nicht konfiguriert und dann unbrauchbar. Hier

ist der Compiler Pass:

$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)] 
    ); 
} 

Um es zusammenzufassen, die Applikatoren Register Verbesserung und Core-Register Applikatoren. Die Kernzuordnung verbindet Verbesserungen mit Anwen- dern, da jede Verbesserung in einem bestimmten Anwen- der registriert werden muss, den der Kern speichert.

Das Problem, dass, wenn ich nur einen Applier anfordern, seine Verbesserungen nicht darin registriert werden, weil der Kern nicht instancied ist.

Vielen Dank.

+0

Kann der Dienst in einen Singleton umgewandelt werden? Wenn dies der Fall ist, können Sie es über ein Kernel-Ereignis instanziieren und es so konfigurieren, dass es später von anderen Objekten aufgerufen wird. –

Antwort

3

Design-Probleme beiseite, ist die einfachste Möglichkeit, einen Dienst zu instanziieren, an event listener zu verwenden. In Ihrem Fall würden Sie nach dem kernel.request hören und Ihren Dienst vom Behälter ziehen.

Verwandte Themen