W tym, di.xml
co pochodzi z Magento2, jest węzeł type
i węzeł virtualType
. Moje pytania brzmią: co to jest virtualType
iw jakim przypadku należy go użyć type
?
W niektórych miejscach wygląda jak symboliczny link lub przepisać:
<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
Tam gdzie jedna pełna ścieżka zostaje zamieniona na inną, ale w innych miejscach wydaje się, że jest używana jako sposób na zdefiniowanie krótszego aliasu.
<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">
magento2
dependency-injection
virtualtype
David Manners
źródło
źródło
Magento\Framework\ObjectManager\Config\Mapper\Dom::convert
.switch
Gdzieś tam jest wypowiedź.lessFileSourceBase
jest ograniczony do xml, czy może być również używany na zewnątrz. Chyba lepiej zacznę kopać.Odpowiedzi:
Typy wirtualne są sposobem na wstrzyknięcie różnych zależności do istniejących klas bez wpływu na inne klasy.
Na przykład
Magento\Framework\Session\Storage
klasa pobiera$namespace
argument w swoim konstruktorze, który przyjmuje domyślną wartość „default”, i możesz użyćtype
definicji, aby zmienić przestrzeń nazw na „core”.Powyższa konfiguracja sprawiłaby, że wszystkie wystąpienia
Magento\Framework\Session\Storage
miałyby przestrzeń nazw „core”. Użycie typu wirtualnego pozwala na utworzenie odpowiednika podklasy, w której tylko podklasa ma zmienione wartości argumentów.W bazie kodu widzimy następujące dwie konfiguracje:
Pierwszy fragment tworzy typ wirtualny, dla
Magento\Core\Model\Session\Storage
którego zmienia przestrzeń nazw, a drugi wstrzykuje typ wirtualnyMagento\Framework\Session\Generic
. Pozwala toMagento\Framework\Session\Generic
na dostosowanie bez wpływu na inne klasy, które również deklarują zależnośćMagento\Framework\Session\Storage
źródło
<type>
używa klasy wirtualnej, która tak naprawdę nie istnieje. W ten sposób modyfikacja argumentuvirtualType
wejdzie w życie tylko wtedy, gdy zainicjowana zostanie klasa używająca virtualType, co jestMagento\Framework\Session\Generic
w przykładzieKolejny sposób na zrozumienie typów wirtualnych -
Powiedzmy, że masz klasę
\Class1
, która ma następujący konstruktor -I
\Class2
ma następujący konstruktor -Teraz chcesz zmienić typ
$argOfClass2
z\Class3
na\Class4
, ale tylko wtedy, gdy\Class2
jest używany jako$argOfClass1
.„Starym” sposobem na to byłoby dodanie następujących elementów w
di.xml
-gdzie
\Class5
jest:Zamiast korzystać z tego sposobu, możesz użyć typów wirtualnych, aby osiągnąć to samo, dodając następujące elementy do
di.xml
:Jak widać, użycie typu wirtualnego pozwoliło Ci zaoszczędzić pracę tworzenia
Class5
.W celu uzyskania dalszych informacji sugeruję przeczytanie artykułu Alana Storma dotyczącego typów wirtualnych w Magento2 - http://alanstorm.com/magento_2_object_manager_virtual_types/
źródło
W tym samym
di.xml
pliku znalazłem, żelessFileSourceBase
jest przekazywany jako argument,lessFileSourceBaseFiltered
który jest przekazywany jako argument,lessFileSourceBaseSorted
który jest przekazywany jako argument typuMagento\Framework\Less\File\Collector\Aggregated
.Nie znalazłem żadnego innego wystąpienia
lessFileSourceBase
(lublessFileSource
) w innym pliku pozadi.xml
modułem głównym. Tylko w niektórych plikach pamięci podręcznej, ale nie są one ważne.Sądzę, że jeśli nie zamierzasz używać typu wirtualnego w klasie PHP, ale tylko w
di
plikach xml, nie jest wymagane, aby wyglądał jak nazwa klasy i możesz użyć aliasu.Ale to tylko spekulacje.
Będzie „zabawnie” spróbować stworzyć klasę i wprowadzić do jej konstruktora instancję,
lessFileSourceBase
aby zobaczyć, jak się zachowuje.źródło
\Magento\Framework\Session\Generic
plik źródłowy do zależąMagento\Core\Model\Session\Storage
zamiastStorageInterface
was powinien dostać „klasa Magento \ Rdzeń \ Modele \ Session \ Storage nie istnieje” wyjątek. Powodem jest to, że ObjectManager nie tworzy instancji typu virtualType, a jedynie używa tego, aby określić, jakie argumenty podać konstruktorowi konkretnego typu, do którego odwołuje się definicja virtualType (Magento\Framework\Session\Storage
w powyższym przykładzie).$requestedType
reprezentuje typ wirtualny i służy do zbierania argumentów, ale$type
jest konkretnym typem, na który virtualType odwzorowuje i jest używany do wywołania instancji obiektu.lessFileSourceBase
byłby w stylu bardziej typu przestrzeni nazw \ klasy, nie pozwoliłby na bezpośrednie odwołanie przez inną klasę php, tylko do wstrzyknięcia przez di.xml