2016-07-26 37 views
0

有在FOSElasticaExtension Extension class爲什麼在DefinitionDecorator中設置工廠而不是使用calls指令設置新類?

$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

你可以寫一個代碼示例,你會如何看待它?我真的不明白你的問題。

要一般性地回答爲什麼要這樣做,你必須瞭解Symfony如何編譯服務容器。服務容器對性能有很大的影響,這就是爲什麼在完成樹構建之後編譯它的原因,這是在實例化所有擴展之後。這也意味着你的擴展並沒有真正的類,而僅僅是類的引用。我假設索引類沒有註冊爲服務,這就是爲什麼它必須通過用作工廠的註冊客戶服務來檢索。我希望這回答你的問題,如果不是隨意擴大你的問題或添加評論。

編輯:這是一個有趣的問題。我檢查了Symfony的依賴注入,但從粗略的一瞥我無法找到兩種方法是完全不同的。從檢查DefinitionTest我想這是可以做到這樣的:

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

這看起來有點複雜。這可能是爲什麼setFactory是首選。

+0

我編輯過的主帖。我主要關心的是使用工廠內部修飾器而不是簡單的方法調用 –

+0

請參閱我的編輯。我認爲沒有什麼重大差異,所以歸結起來,你認爲它看起來更好,並且似乎已經與工廠一起消失了。 – dbrumann

相關問題