Fiquei me perguntando, qual é a maneira correta de implementar um modelo EAV extensível.
Vejo que Magento\Catalog\Model\Product
, em , o método getExtensionAttributes()
é implementado assim:
public function getExtensionAttributes()
{
$extensionAttributes = $this->_getExtensionAttributes();
if (!$extensionAttributes) {
return $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface');
}
return $extensionAttributes;
}
Mas em outros, como os modelos de cliente ou categoria, é apenas
public function getExtensionAttributes()
{
return $this->_getExtensionAttributes();
}
o que pode levar a um resultado NULL , se a chave extension_attributes não tiver sido definida anteriormente.
Pragmaticamente, eu preferiria o primeiro. Dessa maneira, sempre posso ter certeza de obter uma instância Magento\Framework\Api\ExtensionAttributesInterface
, mesmo que o modelo tenha sido instanciado.
Mas por que não é usado em outros módulos então? É contra a nova separação de modelos de dados que vemos no módulo do cliente? Se sim, como devemos inicializar os atributos de extensão?
fonte
$order->getExtensionAttributes()
e foi resolvido depois de receber ordem como abaixo:$order = $this->orderRepositoryInterface->get($order->getId());
. A interface do repositório de pedidos éMagento\Sales\Api\OrderRepositoryInterface
. Não tenho certeza se o problema era mesmoO código é usado de maneira diferente em várias extensões. A funcionalidade é usada para vincular qualquer atributo nessa interface. Para uma melhor compreensão, consulte este link: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/
fonte
getExtensionAttributes()
em entidades personalizadas