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

时间:2016-07-26 16:05:15

标签: symfony foselasticabundle

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:指令设置新类?

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

1 个答案:

答案 0 :(得分:1)

您能否编写一个代码示例,看起来如何?我真的不明白你的问题。

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

编辑:这是一个有趣的问题。我检查了Symfony的DependencyInjection,但从粗略的一瞥我无法找到两种方法究竟有何不同。从检查DefinitionTest开始,我认为可以执行以下操作:

while Gtk.events_pending():
    Gtk.main_iteration_do(False)

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