Magento2는 특정 ExtensionFactory 및 ExtensionAttributeInterface를 어떻게 생성합니까?


28

인용 속성과 같은 확장 속성을 사용하여 머리를 감싸고 싶습니다.
Magento 1과 같은 설정 클래스를 사용하여 이러한 엔티티에 사용자 정의 속성을 추가하는 데 아무런 문제가 없습니다.이 질문에 관한 것이 아닙니다.
엔터티 API를 통해 확장에 의해 추가 된 속성을 확장 속성으로 노출하려고 할 때 마술이 나를 압도합니다.

업데이트 : 일반 팩토리가 생성되는 방법을 알고 있습니다. 이 질문은 생성 된 확장 속성 인터페이스에 대해 생성 된 구현을 인스턴스화하는 특수 팩토리에 관한 것입니다.

작동시키기 위해 취한 단계는 다음과 같습니다. 나는 이것들을 추가하여 대답하려고하는 사람이 그 세부 사항에 들어갈 필요가 없습니다.
내 질문은 어떻게 또는 작동하는지입니다.

엔티티 API를 통해 확장 속성을 노출하는 단계 :

  1. etc/extension_attributes.xml엔티티 인터페이스에 속성을 추가하는를 작성하십시오.
  2. 엔티티 ExtensionAttributes인스턴스에 속성 값을 추가하는 플러그인을 작성하십시오 .

두 번째 요점을 수행하려면 엔티티 ExtensionAttributes인스턴스가 필요합니다. 이러한 이유로 플러그인은 팩토리에 의존하며, 오브젝트 매니저는 DI를 통해 제공합니다.

견적 항목 예제 Magento\Quote\Api\Data\CartItemExtensionFactory를 사용해야합니다.
나는이 공장의 유형이 어떻게 든 세대 마법의 방아쇠가되어야한다고 생각한다.

그런 다음 Magento \Magento\Quote\Api\Data\CartItemExtensionInterface는 모든 확장 속성에 대한 setter 및 getter와 일치하는 인터페이스를 생성 합니다.
그러나 해당 인터페이스에 대한 구체적인 구현을 생성하지는 않습니다. 적어도 PHPStorm은 보이지 않습니다.

Magento는 클래스를 생성하는 데 필요한 정보를 어떻게 수집합니까? 구체적인 인스턴스에서 생성 된 인터페이스 메소드를 어떻게 호출 할 수 있습니까? 메모리에서만 생성되는 클래스입니까?

나는 그것이 작동하는 것이 행복하지만 실제로 만족스럽지 않습니다. 확장 기능으로 자동 생성 된 속성을 사용하는 마젠 토스 기능은 성공의 핵심 요소입니다. 모듈 개발자는 전체 프로세스를 완전히 이해해야한다고 생각합니다.
시간이 있다면 나는 이것을 직접 파고 들지만 설명을 얻을 수 있으면 좋겠다.

업데이트 2 :를 통해 읽을 수있는 약간의 시간을 툭 \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator하고 \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator. 이제 나는 적어도 무슨 일이 일어나고 있는지 대략적인 생각을 가지고 있습니다. 아무도 나를 이길 수 없다면 유용한 프로세스라고 생각할 때 한 번에 전체 프로세스에 대한 설명을 작성합니다.


2
The Vinai는 .. 질문을했다. .Omg
Amit Bera

답변:


26

모든 자동 생성의 첫 번째는 클래스 이름 접미사, 예를 기반으로 일어나고 Factory, ExtensionInterface(참조 \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::EXTENSION_INTERFACE_SUFFIX) 또는 Extension(참조 \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator::EXTENSION_SUFFIX).

적절한 생성기는 여기에서 접미사를 기준으로 선택됩니다 \Magento\Framework\Code\Generator::generateClass.

Magento 모드가 developer있고 누락 된 클래스가 즉시 생성 될 수 있다고 가정합니다 (컴파일러를 사용할 때 비슷한 프로세스가 발생 함). 객체 관리자가 인스턴스화하려고 시도 Magento\Quote\Api\Data\CartItemExtensionFactory했지만 존재하지 않으면 다음과 같은 일이 발생합니다.

  1. 오토로더가 클래스를 인스턴스화하지 못하고 코드 생성을 시작합니다. \Magento\Framework\Code\Generator\Autoloader::load
  2. 그런 다음 클래스 접미사는 Factory(선언 된 모든 접미사 목록을 여기에서 찾을 수 있음 \Magento\Framework\ObjectManager\DefinitionFactory::getCodeGenerator)으로 결정되며 해당 팩토리 생성기 클래스 ( Magento\Framework\ObjectManager\Code\Generator\Factory)는 누락 된 팩토리를 생성하는 데 사용됩니다.
  3. 모든 자동 생성 클래스는 항상 다른 클래스를 기반으로합니다. 팩토리의 경우 소스 클래스 이름은 Factory접미사 를 제거하여 계산 됩니다 Magento\Quote\Api\Data\CartItemExtension. 이 클래스는 존재하지 않으며 오토로더가 자동 생성을 다시 한 번 호출하지만 이번에는 확장 클래스에 대해
  4. 이제 접미사입니다 Extension\Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator이 클래스를 생성하는 데 사용됩니다
  5. 확장 클래스 생성의 소스 클래스는로 계산되며 Magento\Quote\Api\Data\CartItemInterface존재하며 확장 클래스가 성공적으로 생성됩니다. 그러나 확장 클래스 파일을 포함하려고 시도하면 존재하지 않는 Magento\Quote\Api\Data\CartItemExtension구현 때문에 자동 생성이 다시 한 번 트리거 Magento\Quote\Api\Data\CartItemExtensionInterface됩니다.
  6. 접미사입니다 ExtensionInterface\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator생성에 사용됩니다
  7. ExtensionInterface 및 Extension 클래스는의 정보를 기반으로 생성되고 extension_attributes.xml를 통해 액세스 \Magento\Framework\Api\ExtensionAttribute\Config한 다음 Factory가 생성됩니다.

한 가지 중요한 참고 사항은 di.xmlExtension 및 ExtensionInterface가 모두 자동 생성되므로 ExtensionInterface에 대한 기본 설정이 없다는 것입니다 . ExtentionInterface가 construct를 통해 직접 주입 될 것으로 예상되지 않기 때문에 이것은 문제가되지 않습니다.


@Vinai 환영합니다. 현상금은 좋은 놀라움이었습니다. 감사합니다. 업데이트 : 참고로 답변이 수락 된 후 현상금이 시작되면 자동으로 부여되지 않습니다.
Alex Paliarush

0

나에게 오늘 밤 @Alex의 답변 위에 줄을 볼 수 있습니다.

$modelReflection = new \ReflectionClass($extensibleClassName);
        if ($modelReflection->isInterface()
            && $modelReflection->isSubclassOf(self::EXTENSIBLE_INTERFACE_NAME)
            && $modelReflection->hasMethod('getExtensionAttributes')
        ) {
            $this->classInterfaceMap[$extensibleClassName] = $extensibleClassName;
            return $this->classInterfaceMap[$extensibleClassName];
        }

수업 중 \Magento\Framework\Api\ExtensionAttributesFactory

확장 인터페이스가 생성되지 않으면 디버깅을 시작할 수 있습니다. 대부분의 확장 속성은 Magento 2와 같이 클래스를 구성하는 것과 관련이 있습니다.

이 라인들은 말합니다 :

  • extension_attributes의 클래스입니다.

  • \ Magento \ Framework \ Api \ ExtensibleDataInterface를 확장합니까?

  • 이 인터페이스에 getExtensionAttributes라는 함수가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.