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하면 모델이 방금 인스턴스화 된 경우에도 항상의 인스턴스를 얻을 수 있습니다 .

그러나 왜 다른 모듈에서 사용되지 않습니까? 고객 모듈에서 볼 수있는 새로운 데이터 모델 분리와 반대 되는가? 그렇다면 확장 속성을 어떻게 초기화해야합니까?

답변:


1

마 젠토는 더 확장 속성이없는 경우 빈 객체를 생성하는 AbstractExtensibleObject :: _에게 getExtensionAttributes 방법을 업데이트 https://github.com/magento/magento2/commit/375132a81b95fafa4a03a17b72dbacdc90afa745#diff-56d044692f579051647a8284ff39cc0eR165를 이 널 (null)을 반환하지 않습니다 그래서. 예를 들어 vendor / magento / module-customer / Model / Data / Customer.php에서 API 주석을 업데이트해야합니다.

 /**
 * {@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, 나는 NULL을 얻었고 다음 $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.