实现getExtensionAttributes()的正确方法


11

我想知道,实现可扩展EAV模型的正确方法是什么。

我在中看到Magento\Catalog\Model\Product该方法getExtensionAttributes()是这样实现的:

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

但是在其他情况下,例如客户或类别模型

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

如果以前未设置extension_attributes键,则可能导致结果为NULL

务实的是,我希望第一个。这样Magento\Framework\Api\ExtensionAttributesInterface,即使模型刚刚实例化,我也始终可以确保获得的实例。

但是,为什么在其他模块中不使用它呢?是否与我们在客户模块中看到的新的数据模型分离背道而驰?如果是这样,我们应该如何初始化扩展属性?

Answers:


1

如果Magento没有扩展属性https:// ://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 ,则Magento更新了AbstractExtensibleObject :: _ getExtensionAttributes方法以生成空对象, 因此它将永远不会返回null。他们仍然确实需要更新API注释,例如在vendor / magento / module-customer / Model / Data / Customer.php中

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

2

我发现自己实现该方法的方式Magento\Catalog\Model\Product肯定是错误的,并且可能导致讨厌的错误,因此我可以部分回答自己的问题:

如果尚无extension_attributes数据,即_getExtensionAttributes()返回null,则该方法返回扩展属性接口的空实例。

这样可以很好地实现显式协定,并防止出现“在null上调用成员函数”错误,但是它总是返回一个新的空实例,该实例不满足隐式协定,也就是说,我获得了此特定实例的扩展属性容​​器。

这意味着:

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

输出:

NULL

更好的实现如下所示:

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

但是,为什么在其他模块中不使用它呢?是否与我们在客户模块中看到的新的数据模型分离背道而驰?如果是这样,我们应该如何初始化扩展属性?

为此,我仍然没有答案



您是否曾经对此有答案?或者如何最好地解决?我目前在扩展order对象时遇到此问题。
ol'bob dole

@ ol'bobdole,我得到NULL,$order->getExtensionAttributes() 并在得到如下命令后得到解决:$order = $this->orderRepositoryInterface->get($order->getId());。订单存储库界面为Magento\Sales\Api\OrderRepositoryInterface。不确定您的问题是否相同
Sarjan Gautam,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.