GetExtensionAttributes () yöntemini uygulamanın doğru yolu


11

Merak ediyorum, genişletilebilir bir EAV modelini uygulamanın doğru yolu nedir?

Görüyorum ki Magento\Catalog\Model\Product, yöntem getExtensionAttributes()şu şekilde uygulanır:

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

Ancak diğerlerinde, müşteri veya kategori modelleri gibi

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

extension_attributes anahtarı daha önce ayarlanmamışsa NULL sonucuna yol açabilir .

Pragmatik olarak, ilkini tercih ederim. Bu şekilde Magento\Framework\Api\ExtensionAttributesInterface, model yeni başlatılmış olsa bile , her zaman bir örnek alacağımdan emin olabilirim .

Peki neden diğer modüllerde kullanılmıyor? Müşteri modülünde gördüğümüz yeni veri modellerinin ayrılmasına karşı mı? Öyleyse, uzantı niteliklerini nasıl başlatmamız gerekir?

Yanıtlar:


1

Magento hiçbir uzantı nitelikleri varsa bir boş nesne yaratılmasında AbstractExtensibleObject :: _ getExtensionAttributes yöntemi güncellenen https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 o return null her şeyi saklayabilirsiniz. Yine de API ek açıklamasını güncellemeleri gerekiyor, örn. Vendor / magento / module-customer / Model / Data / Customer.php

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

2

Yöntemin uygulanma şeklinin Magento\Catalog\Model\Productkesinlikle yanlış olduğunu ve kötü hatalara yol açabileceğini öğrendiğim için kendi sorumu kısmen cevaplayabilirim :

extension_attributesHenüz veri yoksa , yani _getExtensionAttributes()null değerini döndürürse, yöntem, uzantı öznitelikleri arabiriminin boş bir örneğini döndürür.

Bu, açık sözleşmeyi yerine getirmek için iyidir ve "null durumunda bir üye işlevine çağrı" hatalarını önler, ancak her zaman örtülü sözleşmeyi yerine getirmeyen yeni bir boş örnek döndürür, yani bu özel örnek için bir uzantı öznitelikleri kapsayıcısı alırım .

Bunun anlamı:

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

çıktılar:

NULL

Daha iyi bir uygulama şöyle görünecektir:

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

Peki neden diğer modüllerde kullanılmıyor? Müşteri modülünde gördüğümüz yeni veri modellerinin ayrılmasına karşı mı? Öyleyse, uzantı niteliklerini nasıl başlatmamız gerekir?

Buna hala bir cevabım yok



Buna hiç cevap aldınız mı - ya da bununla başa çıkmanın en iyi yolu nedir? Şu anda bir sipariş nesnesini genişletirken bu sorunu alıyorum.
ol'bob dole

@ ol'bobdole i NULL başlamıştı $order->getExtensionAttributes() ve aşağıda siparişi aldıktan sonra çözüldü: $order = $this->orderRepositoryInterface->get($order->getId());. Sipariş deposu arayüzüdür Magento\Sales\Api\OrderRepositoryInterface. Sorunun aynı olup olmadığından emin değilim
Sarjan Gautam

0

Kod, çeşitli uzantılarda farklı şekillerde kullanılır. İşlev, söz konusu arabirimdeki herhangi bir niteliği bağlamak için kullanılır. Bunu daha iyi anlamak için şu bağlantıya bakın: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


Bu makale soruma cevap vermiyor. Mevcut varlıklara uzantı özniteliklerinin nasıl ekleneceğini biliyorum, özellikle getExtensionAttributes()özel varlıklarda uygulanması hakkında soruyordum
Fabian Schmengler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.