使用CompilerPass,我需要将setter添加到继承特定抽象类的所有服务。 他们已被标记,但只有一些人使用抽象类。
类似的东西:
$abstractServices = $containerBuilder->findServicesByType('MyAbstractClass');
$abstractServices->addMethodCall(
'setHelperService',
[new Reference('@service_to_be_set')
);
你会建议什么?
答案 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
}
}