【问题标题】:Symfony Container - tags services implementing an interfaceSymfony Container - 标记实现接口的服务
【发布时间】:2016-01-20 14:49:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: symfony service interface compilation containers


    【解决方案1】:

    Definition 类的getClass() 方法返回为特定服务配置的类。然后你可以使用is_subclass_of() 函数来检查这个类是否实现了某个接口(这从 PHP 5.3.7 开始有效):

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

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

    【讨论】:

    • 从 Symfony 3.3 开始你应该可以使用registerForAutoconfiguration
    猜你喜欢
    • 2016-11-03
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多