Forma correcta de implementar getExtensionAttributes ()

11

Me preguntaba, ¿cuál es la forma correcta de implementar un modelo EAV extensible?

Veo que en Magento\Catalog\Model\Product, el método getExtensionAttributes()se implementa así:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        return $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
    }
    return $extensionAttributes;
}

Pero en otros, como el cliente o los modelos de categoría, es solo

public function getExtensionAttributes()
{
    return $this->_getExtensionAttributes();
}

que puede conducir a un resultado NULL , si la clave extension_attributes no se ha establecido antes.

Pragmáticamente, preferiría el primero. De esta manera, siempre puedo estar seguro de obtener una instancia Magento\Framework\Api\ExtensionAttributesInterface, incluso si el modelo acaba de ser instanciado.

Pero, ¿por qué no se usa en otros módulos entonces? ¿Va en contra de la nueva separación de modelos de datos que vemos en el módulo del cliente? Si es así, ¿cómo se supone que inicialicemos los atributos de extensión?

Fabian Schmengler
fuente

Respuestas:

1

Magento actualizó el método AbstractExtensibleObject :: _ getExtensionAttributes para generar un objeto vacío si no tiene atributos de extensión https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a0 . Sin embargo, todavía necesitan actualizar la anotación API, por ejemplo, en vendor / magento / module-customer / Model / Data / Customer.php

 /**
 * {@inheritdoc}
 *
 * @return \Magento\Customer\Api\Data\CustomerExtensionInterface|null
 */
public function getExtensionAttributes()
{
    return $this->_getExtensionAttributes();
}
Ryan Sun
fuente
2

Puedo responder parcialmente mi propia pregunta cuando descubrí que la forma en que se implementa el método Magento\Catalog\Model\Productes definitivamente incorrecta y puede provocar errores desagradables:

Si todavía no hay extension_attributesdatos, es decir, _getExtensionAttributes()devuelve nulo, el método devuelve una instancia vacía de la interfaz de atributos de extensión.

Esto es bueno para cumplir con el contrato explícito y evita errores de "Llamar a una función miembro en nulo", pero siempre devuelve una nueva instancia vacía, que no cumple con el contrato implícito, es decir, obtengo un contenedor de atributos de extensión para esta instancia específica .

Eso significa:

$product->getExtensionAttributes()->setStockItem($stockItem);
var_dump($product->getExtensionAttributes()->getStockItem());

salidas:

NULL

Una mejor implementación se vería así:

public function getExtensionAttributes()
{
    $extensionAttributes = $this->_getExtensionAttributes();
    if (!$extensionAttributes) {
        $extensionAttributes = $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
        $this->_setExtensionAttributes($extensionAttributes);
    }
    return $extensionAttributes;
}

Pero, ¿por qué no se usa en otros módulos entonces? ¿Va en contra de la nueva separación de modelos de datos que vemos en el módulo del cliente? Si es así, ¿cómo se supone que inicialicemos los atributos de extensión?

Para eso, todavía no tengo una respuesta

Fabian Schmengler
fuente
Problema de
Fabian Schmengler
¿Alguna vez recibió una respuesta a esto, o cuál es la mejor manera de lidiar con eso? Actualmente recibo este problema al extender un objeto de pedido.
ol'bob dole
@ ol'bobdole, conseguía NULL para $order->getExtensionAttributes() y se resolvió después de conseguir el fin de la siguiente manera: $order = $this->orderRepositoryInterface->get($order->getId());. La interfaz del repositorio de pedidos es Magento\Sales\Api\OrderRepositoryInterface. No estoy seguro si su problema fue el mismo
Sarjan Gautam
0

El código se usa de manera diferente en varias extensiones. La funcionalidad se utiliza para vincular cualquier atributo en esa interfaz. Para una mejor comprensión de esto, consulte este enlace: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


fuente
Este artículo no responde mi pregunta. Sé cómo agregar atributos de extensión a entidades existentes, estaba preguntando específicamente sobre la implementación de getExtensionAttributes()entidades personalizadas
Fabian Schmengler