2016-01-21 54 views
0

使用CompilerPass,我需要將setter添加到所有繼承特定抽象類的服務。 它們已被標記,但只有一些使用抽象類。Symfony DependencyInjection - 如何獲得某種類型的所有服務?

類似的東西:

$abstractServices = $containerBuilder->findServicesByType('MyAbstractClass'); 

$abstractServices->addMethodCall(
    'setHelperService', 
    [new Reference('@service_to_be_set') 
); 

什麼你有什麼建議?

+0

您是否嘗試過使用抽象服務?在這種情況下,你可以定義只在你的父服務中的所有子服務的集合將繼承此 –

+0

你能鏈接到我嗎? –

回答

1

您可以簡單地檢查服務類是否是指定抽象類的子類。

foreach ($container->getDefinitions() as $definition) { 
    if (is_subclass_of($definition->getClass(), 'YourAbstractClass')) { 
     // do something 
    } 
} 
+0

你在練習中使用這個嗎? –

+0

否。查看抽象服務。 –

+0

你能分享一些鏈接嗎?谷歌給了一些各種隨機來源。 –

1

基於托馬斯的回答

$taggedServices = $container->findTaggedServiceIds('your_tag'); 

foreach ($taggedServices as $id => $tags) { 
    $service = $container->findDefinition($id); 
    if (!is_callable($service, 'yourMethodName') { 
     continue; 
     // or raise exception if you need 
    } 
    $service->addMethodCall(...); //whatever 
} 

另一種方式是

$taggedServices = $container->findTaggedServiceIds('your_tag'); 

foreach ($taggedServices as $id => $tags) { 
    $service = $container->findDefinition($id); 
    if (!$service instance YourInterface) { 
     continue; 
     // or raise exception if you need 
    } 
    $service->addMethodCall(...); //whatever 
} 

當然事件是基於標籤和只用實例或抽象類(如果方法您正在搜索的工作原理在後一種情況下是抽象的)

+0

這是有點解決方法,但似乎是迄今爲止最好的。謝謝。你能想到其他不使用標籤的東西嗎? –

+0

@TomášVotruba如果Tomasz沒有回答,我會回答相同的,所以不,我認爲是最好的方法:) – DonCallisto

+0

我不會認爲這是一個解決方法,答案似乎是一個完全合法的方式來做你的正在做。 –

相關問題