Cara yang benar untuk mengimplementasikan getExtensionAttributes ()

11

Saya bertanya-tanya, apa cara yang tepat untuk menerapkan model EAV yang dapat dikembangkan.

Saya melihat bahwa dalam Magento\Catalog\Model\Product, metode getExtensionAttributes()diimplementasikan seperti ini:

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

Tetapi pada orang lain, seperti model pelanggan atau kategori itu saja

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

yang dapat menyebabkan hasil NULL , jika kunci extension_attributes belum ditetapkan sebelumnya.

Secara pragmatis, saya lebih suka yang pertama. Dengan cara ini saya selalu bisa memastikan untuk mendapatkan contoh Magento\Framework\Api\ExtensionAttributesInterface, bahkan jika model baru saja dipakai.

Tapi mengapa itu tidak digunakan dalam modul lain? Apakah itu bertentangan dengan pemisahan baru model data yang kita lihat dalam modul pelanggan? Jika demikian, bagaimana kita menginisialisasi atribut ekstensi?

Fabian Schmengler
sumber

Jawaban:

1

Magento memperbarui AbstractExtensibleObject :: _ metode getExtensionAttributes untuk menghasilkan objek kosong jika memiliki atribut ekstensi https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 sehingga tidak akan pernah kembali null. Mereka masih perlu memperbarui anotasi API, misalnya di vendor / magento / module-customer / Model / Data / Customer.php

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

Saya dapat sebagian menjawab pertanyaan saya sendiri ketika saya mengetahui bahwa cara metode ini diterapkan Magento\Catalog\Model\Productsudah pasti salah dan dapat menyebabkan bug jahat:

Jika belum ada extension_attributesdata, yaitu _getExtensionAttributes()mengembalikan null, metode mengembalikan instance kosong dari antarmuka atribut ekstensi.

Ini bagus untuk memenuhi kontrak eksplisit dan mencegah kesalahan "Panggil ke fungsi anggota pada null" tetapi selalu mengembalikan contoh kosong baru, yang tidak memenuhi kontrak implisit, yaitu bahwa saya mendapatkan wadah atribut ekstensi untuk contoh khusus ini .

Itu berarti:

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

output:

NULL

Implementasi yang lebih baik akan terlihat seperti ini:

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

Tapi mengapa itu tidak digunakan dalam modul lain? Apakah itu bertentangan dengan pemisahan baru model data yang kita lihat dalam modul pelanggan? Jika demikian, bagaimana kita menginisialisasi atribut ekstensi?

Untuk itu, saya masih belum punya jawaban

Fabian Schmengler
sumber
Masalah Github: github.com/magento/magento2/issues/5979
Fabian Schmengler
Apakah Anda pernah mendapatkan jawaban untuk ini - atau bagaimana cara terbaik untuk menghadapinya? Saya saat ini mendapatkan masalah ini saat memperluas objek pesanan.
ol'bob membagikan
@ ol'bobdole, saya mendapatkan NULL untuk $order->getExtensionAttributes() dan diselesaikan setelah mendapatkan pesanan sebagai berikut: $order = $this->orderRepositoryInterface->get($order->getId());. Antarmuka urutan penyimpanan adalah Magento\Sales\Api\OrderRepositoryInterface. Tidak yakin apakah masalah Anda sama
Sarjan Gautam
0

Kode ini digunakan dengan cara berbeda di berbagai ekstensi. Fungsionalitas digunakan untuk mengikat atribut apa pun di antarmuka itu. Untuk pemahaman yang lebih baik tentang ini, lihat tautan ini: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


sumber
Artikel ini tidak menjawab pertanyaan saya. Saya tahu bagaimana cara menambahkan atribut ekstensi ke entitas yang ada, saya bertanya secara khusus tentang penerapan getExtensionAttributes()entitas kustom
Fabian Schmengler