Đúng cách để triển khai getExtensionAttribut ()


11

Tôi đã tự hỏi, cách đúng đắn để thực hiện một mô hình EAV mở rộng là gì.

Tôi thấy rằng trong Magento\Catalog\Model\Product, phương thức getExtensionAttributes()được thực hiện như thế này:

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

Nhưng ở những người khác, như mô hình khách hàng hoặc danh mục, đó chỉ là

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

điều này có thể dẫn đến kết quả NULL , nếu khóa extension_attribut chưa được đặt trước đó.

Thực tế, tôi thích cái đầu tiên. Bằng cách này, tôi luôn có thể chắc chắn có được một thể hiện Magento\Framework\Api\ExtensionAttributesInterface, ngay cả khi mô hình vừa được khởi tạo.

Nhưng tại sao nó không được sử dụng trong các mô-đun khác? Có phải nó chống lại sự phân tách mới của các mô hình dữ liệu mà chúng ta thấy trong mô-đun khách hàng không? Nếu vậy, chúng ta phải khởi tạo các thuộc tính mở rộng như thế nào?

Câu trả lời:


1

Magento cập nhật AbstractExtensibleObject :: _ phương pháp getExtensionAttributes để tạo ra một đối tượng rỗng nếu nó không có phần mở rộng thuộc tính https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165 vì vậy nó sẽ không bao giờ trở về null. Mặc dù vậy, họ vẫn cần cập nhật chú thích API, ví dụ: trong nhà cung cấp / magento / mô-đun-khách hàng / Mô hình / Dữ liệu / Khách hàng.php

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

2

Tôi có thể trả lời một phần câu hỏi của chính mình khi tôi phát hiện ra rằng cách thức thực hiện phương pháp Magento\Catalog\Model\Productnày chắc chắn là sai và có thể dẫn đến các lỗi khó chịu:

Nếu chưa có extension_attributesdữ liệu, tức là _getExtensionAttributes()trả về null, phương thức trả về một thể hiện trống của giao diện thuộc tính mở rộng.

Điều này là tốt để thực hiện hợp đồng rõ ràng và ngăn ngừa lỗi "Gọi đến hàm thành viên khi null" nhưng nó luôn trả về một thể hiện trống mới, không hoàn thành hợp đồng ngầm, cụ thể là tôi nhận được một thùng chứa thuộc tính mở rộng cho trường hợp cụ thể này .

Điều đó có nghĩa là:

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

đầu ra:

NULL

Một triển khai tốt hơn sẽ như thế này:

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

Nhưng tại sao nó không được sử dụng trong các mô-đun khác? Có phải nó chống lại sự phân tách mới của các mô hình dữ liệu mà chúng ta thấy trong mô-đun khách hàng không? Nếu vậy, chúng ta phải khởi tạo các thuộc tính mở rộng như thế nào?

Về điều đó, tôi vẫn chưa có câu trả lời.



Bạn đã bao giờ nhận được câu trả lời cho điều này - hoặc cách tốt nhất để giải quyết nó? Tôi hiện đang gặp vấn đề này trong khi mở rộng một đối tượng đặt hàng.
ol'bob dole

@ ol'bobdole, tôi đã nhận được NULL $order->getExtensionAttributes() và đã được giải quyết sau khi nhận được đơn đặt hàng như sau : $order = $this->orderRepositoryInterface->get($order->getId());. Giao diện kho lưu trữ là Magento\Sales\Api\OrderRepositoryInterface. Không chắc vấn đề của bạn có giống nhau không
Sarjan Gautam

0

Mã được sử dụng theo cách khác nhau trong các phần mở rộng khác nhau. Các chức năng được sử dụng để liên kết bất kỳ thuộc tính trong giao diện đó. Để hiểu rõ hơn về điều này, hãy tham khảo liên kết này: http://oyenetwork.com/articles/magento2-devliery-date-module-creation-from-scratch/


Bài viết này không trả lời câu hỏi của tôi. Tôi biết cách thêm thuộc tính mở rộng cho các thực thể hiện có, tôi đã hỏi cụ thể về việc triển khai getExtensionAttributes()trong các thực thể tùy chỉnh
Fabian Schmengler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.