Me gustaría entender cómo usar los atributos de extensión, por ejemplo, para los elementos de cotización.
No es ningún problema agregar un atributo personalizado a dicha entidad utilizando una clase de configuración como en Magento 1, de esto no se trata esta pregunta.
En este momento, la magia me abruma cuando quiero exponer un atributo que fue agregado por una extensión a través de la API de entidades como un atributo de extensión.
ACTUALIZACIÓN : Sé cómo se generan las fábricas regulares. Esta pregunta trata sobre las fábricas especiales que crean instancias de las implementaciones generadas para las interfaces de atributos de extensión generadas.
Estos son los pasos que tomo para que funcione. Estoy agregando estos para que quien intente responder no necesite entrar en esos detalles.
Mi pregunta es CÓMO o POR QUÉ funciona.
Pasos para exponer un atributo de extensión a través de una API de entidad:
- Cree un
etc/extension_attributes.xml
que agregue el atributo a la interfaz de la entidad - Cree un complemento para agregar el valor del atributo a la
ExtensionAttributes
instancia de las entidades .
Para hacer el segundo punto, ExtensionAttributes
se necesita la instancia de las entidades . Por esta razón, el complemento depende de una fábrica, que el administrador de objetos suministra a través de DI.
Para el ejemplo del artículo de presupuesto Magento\Quote\Api\Data\CartItemExtensionFactory
debe usarse.
Supongo que el tipo de esta fábrica de alguna manera debe ser el detonante de la magia de la generación.
Luego, Magento genera la interfaz correspondiente \Magento\Quote\Api\Data\CartItemExtensionInterface
con los establecedores y captadores para todos los atributos de extensión.
Sin embargo, no parece generar la implementación concreta para esa interfaz. Al menos, PHPStorm no lo está viendo.
¿Cómo recopila Magento la información que necesita para generar la clase? ¿Cómo se pueden invocar los métodos de interfaz generados en una instancia concreta? ¿Es una clase que solo se genera en la memoria?
Estoy feliz de que funcione, pero eso no es realmente satisfactorio. La capacidad de Magentos para usar atributos creados automáticamente por extensiones es un factor clave para su éxito. Como desarrollador de módulos, creo que necesito una comprensión profunda de todo el proceso.
Si tuviera tiempo, simplemente investigaría esto yo mismo, pero preferiría si pudiera obtener una explicación.
ACTUALIZACIÓN 2 : Tomó un poco de tiempo para leer \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
y \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
. Ahora al menos tengo una idea aproximada de lo que está sucediendo. Si nadie me gana, escribiré una descripción del proceso completo en un punto, ya que creo que sería una referencia útil.