Im di.xml
Lieferumfang von Magento2 gibt es einen Knoten type
und einen Knoten virtualType
. Meine Frage ist, was ist das virtualType
und in welchem Fall sollte es stattdessen verwendet werden type
?
An einigen Stellen sieht es aus wie ein symbolischer Link oder ein Umschreiben:
<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
Wenn ein vollständiger Pfad in einen anderen geändert wird, aber an anderen Stellen, scheint er als Methode zum Definieren eines kürzeren Alias verwendet zu werden.
<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">
magento2
dependency-injection
virtualtype
David Manners
quelle
quelle
Magento\Framework\ObjectManager\Config\Mapper\Dom::convert
.switch
Irgendwo drin steht eine Aussage.lessFileSourceBase
das auf die xml beschränkt ist oder ob das auch draußen verwendet werden kann. Schätze, ich muss besser graben.Antworten:
Virtuelle Typen sind eine Möglichkeit, verschiedene Abhängigkeiten in vorhandene Klassen einzufügen, ohne andere Klassen zu beeinflussen.
Beispielsweise nimmt die
Magento\Framework\Session\Storage
Klasse$namespace
in ihrem Konstruktor ein Argument an, das standardmäßig den Wert 'default' hat, und Sie können dietype
Definition verwenden, um den Namespace in 'core' zu ändern.Die obige Konfiguration würde es so machen, dass alle Instanzen von
Magento\Framework\Session\Storage
einen Namespace von 'core' haben. Bei Verwendung eines virtuellen Typs kann das Äquivalent einer Unterklasse erstellt werden, wobei nur die Unterklasse die geänderten Argumentwerte aufweist.In der Codebasis sehen wir die folgenden zwei Konfigurationen:
Das erste Snippet erstellt einen virtuellen Typ, für
Magento\Core\Model\Session\Storage
den der Namespace geändert wird, und das zweite Snippet fügt den virtuellen Typ einMagento\Framework\Session\Generic
. Dies ermöglichtMagento\Framework\Session\Generic
das Anpassen, ohne andere Klassen zu beeinflussen, von denen ebenfalls eine Abhängigkeit deklariert wirdMagento\Framework\Session\Storage
quelle
<type>
verwendet eine virtuelle Klasse, die eigentlich nicht existiert. Auf diese Weise wird die Änderung des ArgumentsvirtualType
nur wirksam, wenn die Klasse, die den virtualType verwendet, initialisiert wird, wieMagento\Framework\Session\Generic
im BeispielEin anderer Weg, virtuelle Typen zu verstehen -
Angenommen, Sie haben eine Klasse
\Class1
mit dem folgenden Konstruktor:Und
\Class2
hat den folgenden Konstruktor -Jetzt wollen Sie die Art der Änderungen
$argOfClass2
aus\Class3
zu\Class4
, aber nur , wenn\Class2
verwendet , wie$argOfClass1
.Der "alte" Weg, dies zu tun, besteht darin, Folgendes hinzuzufügen
di.xml
:wo
\Class5
ist das folgende:Anstatt diese Methode zu verwenden, können Sie die virtuellen Typen verwenden , um dasselbe zu erreichen, indem Sie Folgendes hinzufügen
di.xml
:Wie Sie sehen können, haben Sie mit dem virtuellen Typ die Arbeit der Erstellung von gespeichert
Class5
.Als weitere Referenz schlage ich vor, den Artikel von Alan Storm über virtuelle Typen in Magento2 zu lesen - http://alanstorm.com/magento_2_object_manager_virtual_types/
quelle
In der gleichen
di.xml
Datei habe ich festgestellt, dasslessFileSourceBase
als Argument für übergeben wird,lessFileSourceBaseFiltered
dass als Argument für übergeben wird,lessFileSourceBaseSorted
dass als Argument für Typ übergeben wirdMagento\Framework\Less\File\Collector\Aggregated
.Ich habe kein anderes Vorkommen von
lessFileSourceBase
(oderlessFileSource
) in einer anderen Datei gefunden, außerdi.xml
im Kernmodul. Nur in einigen Cache-Dateien sind diese aber nicht wichtig.Ich denke, wenn Sie den virtuellen Typ nicht in einer PHP-Klasse verwenden, sondern nur in den
di
XML-Dateien, müssen Sie ihn nicht wie einen Klassennamen aussehen lassen, und Sie können einen Alias verwenden.Dies ist jedoch nur reine Spekulation.
Es wird "Spaß" machen, zu versuchen, eine Klasse zu erstellen und in ihren Konstruktor eine Instanz von einzufügen, um
lessFileSourceBase
zu sehen, wie sie sich verhält.quelle
\Magento\Framework\Session\Generic
Quelldatei hängen vonMagento\Core\Model\Session\Storage
stattStorageInterface
sollten Sie eine bekommen ‚Klasse Magento \ Core \ Modell \ Session \ Storage ist nicht vorhanden‘ Ausnahme. Der Grund dafür ist, dass ObjectManager keine Instanz von virtualType erstellt, sondern nur ermittelt, welche Argumente für den Konstruktor des konkreten Typs bereitzustellen sind, auf den in der virtualType-Definition verwiesen wird (Magento\Framework\Session\Storage
für das obige Beispiel).$requestedType
der virtuelle Typ dargestellt wird und zum Sammeln von Argumenten verwendet$type
wird. Dies ist jedoch der konkrete Typ, dem der virtualType zugeordnet ist und der für den Objektinstanziierungsaufruf verwendet wird.lessFileSourceBase
es sich um einen Namespace \ class-Typ handelte, würde es keinen direkten Verweis durch eine andere PHP-Klasse zulassen, nur zur Injektion über die di.xml