2016-07-26 2 views
0

Es ist Teil des Codes in FOSElasticaExtension Extension classWarum Factory in DefinitionDecorator setzen, statt neue Klasse mit Aufrufanweisung zu setzen?

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

so in yaml es könnte wie folgt aussehen:

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

Warum set Fabrik in DefinitionDecorator statt setzen neue Klasse mit calls: Richtlinie?

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

Antwort

1

Können Sie bitte ein Codebeispiel schreiben, wie Sie es erwarten würden? Ich verstehe Ihre Frage nicht wirklich.

Um allgemein zu antworten, warum es so gemacht wird, müssen Sie verstehen, wie Symfony den Service-Container kompiliert. Der Servicebehälter hat einen großen Einfluss auf die Leistung. Deshalb wird er kompiliert, nachdem der Baum vollständig erstellt wurde, und zwar nachdem alle Erweiterungen instanziiert wurden. Das bedeutet auch, dass Ihre Erweiterung nicht wirklich die Klassen, sondern nur Referenzen auf Klassen hat. Ich gehe davon aus, dass die Indexklasse nicht als Service registriert ist und deshalb über den registrierten Client-Service, der als Factory verwendet wird, abgerufen werden muss. Ich hoffe, dies beantwortet Ihre Frage, wenn Sie nicht zögern, Ihre Frage zu erweitern oder einen Kommentar hinzuzufügen.

edit: Das ist eine interessante Frage. Ich habe Symfonys DependencyInjection überprüft, aber von einem flüchtigen Blick kann ich nicht herausfinden, wie genau beide Ansätze unterschiedlich sind. Von DefinitionTest Überprüfung Ich gehe davon aus es möglich ist, so etwas wie zu tun:

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

, die etwas komplizierter aussieht. Dies könnte der Grund sein, warum setFactory bevorzugt wurde.

+0

ich bearbeitet Hauptpost. Mein Hauptanliegen ist über den Punkt der Verwendung von Fabrik Innen Dekorator anstelle von einfachen Methodenaufrufen –

+0

siehe meine Bearbeitung. Ich glaube nicht, dass es einen großen Unterschied gibt, also kommt es darauf an, was Sie für schicker halten und foselastischabundle scheint mit der Fabrik gegangen zu sein. – dbrumann

Verwandte Themen