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
答案 0 :(得分:1)
您能否编写一个代码示例,看起来如何?我真的不明白你的问题。
通常回答为什么这样做,你必须了解Symfony如何编译服务容器。服务容器对性能有巨大影响,这就是为什么在完全构建树之后编译它,这是在实例化所有扩展之后。这也意味着你的扩展实际上并没有类,只是对类的引用。我假设索引类未注册为服务,这就是必须通过用作工厂的注册客户端服务检索它的原因。我希望这可以回答您的问题,如果没有随意扩展您的问题或添加评论。
编辑:这是一个有趣的问题。我检查了Symfony的DependencyInjection,但从粗略的一瞥我无法找到两种方法究竟有何不同。从检查DefinitionTest开始,我认为可以执行以下操作:
while Gtk.events_pending():
Gtk.main_iteration_do(False)
看起来有点复杂。这可能是首选setFactory的原因。