In Magento 2 ist ein VirtualType ein Objekttyp, der über den Dependency-Injection-Mechanismus (DI) erstellt und konfiguriert wird.

Ein VirtualType ist keine konkrete Klasse, sondern eine Möglichkeit, eine Reihe von Argumenten und Konfigurationen zu definieren, mit denen sich eine Objektinstanz dynamisch erzeugen lässt. Das kann nützlich sein, wenn Sie ein Objekt mit einer komplexen Menge an Abhängigkeiten oder Konfigurationsoptionen benötigen, ohne dafür eine konkrete Klasse anlegen zu wollen.

Um einen VirtualType in Magento 2 zu erstellen, müssen Sie ihn zunächst in der di.xml-Datei Ihres Moduls definieren.

Zur Definition eines VirtualType müssen Sie in der di.xml folgende Angaben machen:

name: der Name des VirtualType. Dies sollte ein eindeutiger Bezeichner sein, mit dem in anderen Teilen der Magento-2-Codebasis auf den VirtualType verwiesen wird.
type: die Klasse, auf der der VirtualType basiert.
shared: ein Boolean-Wert, der angibt, ob der VirtualType ein Singleton ist. Bei true wird pro Request nur eine Instanz erzeugt; bei false wird bei jeder Anforderung des VirtualType eine neue Instanz erzeugt.

Hier ein Beispiel:

<virtualType name="MyVirtualType" type="My\Module\Model\MyClass">
    <arguments>
        <argument name="arg1" xsi:type="string">value1</argument>
        <argument name="arg2" xsi:type="string">value2</argument>
    </arguments>
</virtualType>

In diesem Beispiel definieren wir einen VirtualType namens MyVirtualType, eine Instanz der Klasse My\Module\Model\MyClass. Im Abschnitt arguments können Sie alle Argumente angeben, die der Konstruktor von MyClass benötigt. In diesem Fall geben wir zwei String-Werte für arg1 und arg2 an.

Sobald Sie Ihren VirtualType definiert haben, können Sie ihn in Ihrem Code als Abhängigkeit injizieren. Beispiel:

use My\Module\Model\MyClass;

class MyController extends \Magento\Framework\App\Action\Action
{
    protected $myVirtualType;

    public function __construct(MyClass $myVirtualType)
    {
        $this->myVirtualType = $myVirtualType;
    }

    public function execute()
    {
        // $this->myVirtualType hier verwenden
    }
}

In diesem Beispiel injizieren wir unseren VirtualType MyVirtualType in einen Controller. Das DI-System von Magento 2 erzeugt automatisch eine Instanz von MyClass mit den in der di.xml angegebenen Argumenten und übergibt sie an den Konstruktor des Controllers.

Der Einsatz von VirtualTypes in Magento 2 kann Ihren Code vereinfachen und ihn modularer und flexibler machen.