Symfony 容器 - 标记服务实现接口

Symfony Container - tags services implementing an interface

我想使用编译器遍历所有标有特定标签的服务,并使用它们的一些 public 方法来注入配置细节。标签本身允许我这样做,但我需要确保服务确实具有这些方法,这就是我为所有这些方法使用接口的原因。

在继续注入之前,编译器传递中是否有一种方法可以检查特定服务是否实现了给定接口。当然,如果方法不存在,它将失败,但接口检查将允许更好地控制服务定义。

无法在定义中找到它 class。 Symfony 是否支持在编译容器时进行这样的检查。

getClass() 方法 Definition class returns class 为特定服务配置。然后,您可以使用 is_subclass_of() 函数来检查此 class 是否实现了某个接口(自 PHP 5.3.7 起有效):

if (is_subclass_of($definition->getClass(), 'SomeInterface')) {
    // do whatever you want here
}

您需要小心,让您的编译器尽可能晚地传递 运行,因为其他传递可能仍会在您的传递执行后更改定义的 class。