วิธีที่ถูกต้องในการใช้งาน 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();
}

ซึ่งสามารถนำไปสู่ผลลัพธ์NULLถ้าคีย์extension_attributesไม่ได้ตั้งค่าก่อน

ในทางปฏิบัติฉันต้องการคนแรก วิธีนี้ทำให้ฉันมั่นใจได้เสมอว่าจะได้รับอินสแตนซ์Magento\Framework\Api\ExtensionAttributesInterfaceแม้ว่าตัวแบบนั้นเพิ่งจะถูกทำให้เป็นตัวอย่าง

แต่ทำไมมันไม่ใช้ในโมดูลอื่นแล้ว? เป็นการแยกแบบจำลองข้อมูลใหม่ที่เราเห็นในโมดูลลูกค้าหรือไม่ ถ้าเป็นเช่นนั้นเราควรจะเริ่มต้นคุณลักษณะส่วนขยายได้อย่างไร

คำตอบ:


1

วีโอไอพีที่ปรับปรุง AbstractExtensibleObject :: _ วิธี getExtensionAttributes ในการสร้างวัตถุที่ว่างเปล่าถ้ามันมีนามสกุลไม่มีแอตทริบิวต์ https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 ดังนั้นมันจะไม่กลับมา null พวกเขายังคงต้องอัปเดตคำอธิบายประกอบ API แม้ว่าเช่นในผู้ขาย / magento / โมดูลลูกค้าลูกค้า / รุ่น / ข้อมูล / 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;
}

แต่ทำไมมันไม่ใช้ในโมดูลอื่นแล้ว? เป็นการแยกแบบจำลองข้อมูลใหม่ที่เราเห็นในโมดูลลูกค้าหรือไม่ ถ้าเป็นเช่นนั้นเราควรจะเริ่มต้นคุณลักษณะส่วนขยายได้อย่างไร

เพื่อที่ฉันยังคงไม่มีคำตอบ



คุณเคยได้รับคำตอบเกี่ยวกับเรื่องนี้หรือจะจัดการกับมันอย่างไรดีที่สุด? ขณะนี้ฉันได้รับปัญหานี้ขณะขยายวัตถุใบสั่ง
ol'bob dole

@ ol'bobdole ผมได้รับเป็นโมฆะสำหรับและได้รับการแก้ไขหลังจากที่ได้รับการสั่งซื้อดังต่อไปนี้:$order->getExtensionAttributes() อินเตอร์เฟซที่เก็บข้อมูลการสั่งซื้อคือ$order = $this->orderRepositoryInterface->get($order->getId()); Magento\Sales\Api\OrderRepositoryInterfaceไม่แน่ใจว่าปัญหาของคุณเหมือนกันหรือไม่
Sarjan Gautam

0

รหัสนี้ใช้ในวิธีที่แตกต่างกันในส่วนขยายต่างๆ ฟังก์ชันนี้ใช้เพื่อเชื่อมโยงแอตทริบิวต์ใด ๆ ในอินเทอร์เฟซนั้น เพื่อความเข้าใจที่ดีขึ้นโปรดอ้างอิงลิงค์นี้: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


บทความนี้ไม่ตอบคำถามของฉัน ฉันรู้วิธีเพิ่มแอตทริบิวต์ส่วนขยายไปยังเอนทิตีที่มีอยู่ฉันถูกถามโดยเฉพาะเกี่ยวกับการนำไปใช้getExtensionAttributes()ในเอนทิตีแบบกำหนดเอง
Fabian Schmengler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.