为什么在 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 的原因。
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 的原因。