为什么在 DefinitionDecorator 中设置工厂而不是使用调用指令设置新的 class?

Why set factory in DefinitionDecorator instead of set new class with calls directive?

FOSElasticaExtension 中有部分代码Extension class

$Def = new DefinitionDecorator('foo');
$Def->replaceArgument(0, $bar);
$Def->addTag('baz', array( 'name' => $qux, ));
$Def->setFactory(array(new Reference('quux'), 'corge'));

所以在 yaml 中它可能看起来像这样:

services:
   foo:
       arguments:
           - '$bar'
       tags:
           -  { name: baz } 
       factory: ["@quux", corge]

为什么在 DefinitionDecorator 中设置工厂而不是使用 calls: 指令设置新的 class?

services:
   foo:
       arguments:
           - '$bar'
       tags:
           -  { name: baz } 
       class: @quux
       calls: corge

能否请您编写一个代码示例,您希望它看起来像什么?我真的不明白你问题的重点。

要笼统地回答为什么这样做,您必须了解 Symfony 是如何编译服务容器的。服务容器对性能有巨大影响,这就是为什么它在树完全构建之后编译,也就是在实例化所有扩展之后。这也意味着您的扩展实际上没有 classes,而只是对 classes 的引用。我假设索引 class 未注册为服务,这就是为什么必须通过用作工厂的已注册客户端服务检索它的原因。我希望这能回答您的问题,如果不能随意扩展您的问题或添加评论。

编辑:这是一个有趣的问题。我检查了 Symfony 的 DependencyInjection,但粗略地看了一下,我找不到这两种方法到底有何不同。通过检查 DefinitionTest,我认为可以执行以下操作:

$def->setMethodCalls(array(array($factoryReference,'getIndex')));

看起来有点复杂。这可能就是首选 setFactory 的原因。