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?
fuente
$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 esMagento\Sales\Api\OrderRepositoryInterface
. No estoy seguro si su problema fue el mismoEl 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
getExtensionAttributes()
entidades personalizadas