Symfony DependencyInjection - 如何获得某种类型的所有服务?

时间:2016-01-21 15:23:09

标签: symfony dependency-injection

使用CompilerPass,我需要将setter添加到继承特定抽象类的所有服务。 他们已被标记,但只有一些人使用抽象类。

类似的东西:

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

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

你会建议什么?

2 个答案:

答案 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
}

当然,基于标签的事件仅适用于实例或抽象类(如果您正在搜索的方法在后一种情况下是抽象的)

答案 1 :(得分:1)

您可以简单地检查服务类是否是指定抽象类的子类。

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