En el di.xmlque viene con Magento2 hay un nodo typey un nodo virtualType. Mi pregunta es: ¿qué es esto virtualTypey en qué caso debería usarse en lugar de type?
En algunos lugares parece un enlace simbólico o reescribir:
<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
Cuando una ruta completa se convierte en otra, pero en otros lugares parece usarse como una forma de definir un alias más corto.
<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">
magento2
dependency-injection
virtualtype
David modales
fuente
fuente

Magento\Framework\ObjectManager\Config\Mapper\Dom::convert. Hay unaswitchdeclaración allí en alguna parte.lessFileSourceBasese limita al xml o si eso también se puede usar afuera. Supongo que mejor me cavo.Respuestas:
Los tipos virtuales son una forma de inyectar diferentes dependencias en las clases existentes sin afectar a otras clases.
Por ejemplo, la
Magento\Framework\Session\Storageclase toma un$namespaceargumento en su constructor, que por defecto es el valor 'predeterminado', y podría usar latypedefinición para cambiar el espacio de nombres a 'núcleo'.La configuración anterior haría que todas las instancias
Magento\Framework\Session\Storagetengan un espacio de nombres de 'núcleo'. El uso de un tipo virtual permite crear el equivalente de una subclase, donde solo la subclase tiene los valores de argumento alterados.En el código base vemos las siguientes dos configuraciones:
El primer fragmento crea un tipo virtual para el
Magento\Core\Model\Session\Storageque altera el espacio de nombres, y el segundo inyecta el tipo virtualMagento\Framework\Session\Generic. Esto permiteMagento\Framework\Session\Genericser personalizado sin afectar otras clases que también declaran una dependencia enMagento\Framework\Session\Storagefuente
<type>está usando una clase virtual que en realidad no existe. De esta manera, la modificación del argumentovirtualTypetendrá efecto solo cuando se inicialice la clase que usa virtualType, que esMagento\Framework\Session\Genericen el ejemploOtra forma de entender los tipos virtuales:
Digamos que tiene una clase
\Class1, que tiene el siguiente constructor:Y
\Class2tiene el siguiente constructor:Ahora, desea cambiar el tipo de
$argOfClass2de\Class3a\Class4, pero solo cuando\Class2se usa como$argOfClass1.La forma "antigua" de hacerlo sería agregar lo siguiente en
di.xml-donde
\Class5es lo siguiente:En lugar de usarlo de esta manera, puede usar los tipos virtuales para lograr lo mismo, agregando lo siguiente a
di.xml:Como puede ver, usar el tipo virtual le ahorró el trabajo de creación
Class5.Para mayor referencia, sugiero leer el artículo de Alan Storm sobre los tipos virtuales en Magento2: http://alanstorm.com/magento_2_object_manager_virtual_types/
fuente
En el mismo
di.xmlarchivo encontré quelessFileSourceBasese pasa como argumento paralessFileSourceBaseFilteredeso se pasa como argumento paralessFileSourceBaseSortedeso se pasa como argumento para typeMagento\Framework\Less\File\Collector\Aggregated.No encontré ninguna otra aparición de
lessFileSourceBase(olessFileSource) en otro archivo, exceptodi.xmldel módulo central. Solo en algunos archivos de caché, pero no son importantesSupongo que si no va a usar el tipo virtual en una clase PHP, pero solo en los
diarchivos xml, no es necesario que parezca un nombre de clase y puede usar un alias.Pero esto es solo pura especulación.
Será "divertido" intentar crear una clase e inyectar una instancia en su constructor
lessFileSourceBasepara ver cómo se comporta.fuente
\Magento\Framework\Session\Genericarchivo de origen para dependerMagento\Core\Model\Session\StoragedeStorageInterfaceél, debería obtener una excepción 'Clase Magento \ Core \ Model \ Session \ Storage no existe'. La razón es que ObjectManager no crea una instancia de virtualType, sino que solo la usa para determinar qué argumentos proporcionar para el constructor del tipo concreto al que hace referencia la definición de virtualType (Magento\Framework\Session\Storagepara el ejemplo anterior).$requestedTyperepresenta el tipo virtual y se usa para recopilar argumentos, pero$typees el tipo concreto al que se asigna virtualType y se usa para la llamada de instanciación de objetos.lessFileSourceBaseestuviera en un estilo de tipo de espacio de nombres \ clase más, no permitiría la referencia directa de otra clase de php, solo para inyección a través de di.xml