문제

예를 들어 견적 항목과 같은 확장 속성을 사용하여 머리를 감싸고 싶습니다.
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는 클래스를 생성하는 데 필요한 정보를 어떻게 수집합니까?생성된 인터페이스 메서드를 구체적인 인스턴스에서 어떻게 호출할 수 있나요?메모리에서만 생성되는 클래스인가요?

효과가 있어서 기쁘지만 실제로는 만족스럽지 않습니다.확장 프로그램에 의해 자동으로 생성된 속성을 사용하는 Magentos 기능은 성공의 핵심 요소 중 하나입니다.모듈 개발자로서 전체적인 프로세스에 대한 철저한 이해가 필요하다고 생각합니다.
시간이 있으면 직접 파헤쳐보고 싶지만 설명을 들을 수만 있다면 더 좋겠습니다.

업데이트 2:읽는 데 약간의 시간이 걸렸습니다. \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator 그리고 \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator.이제 나는 적어도 무슨 일이 일어나고 있는지 대략적으로 알 수 있습니다.아무도 나보다 앞서지 못한다면 유용한 참고가 될 것이라고 생각하여 한 시점에서 전체 과정에 대한 설명을 작성하겠습니다.

도움이 되었습니까?

해결책

우선, 클래스 이름 접미사를 기반으로 자동 생성이 발생합니다. 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) 및 해당 Factory 생성기 클래스(Magento\Framework\ObjectManager\Code\Generator\Factory)는 누락된 공장을 생성하는 데 사용됩니다.
  3. 자동 생성된 모든 클래스는 항상 다른 클래스를 기반으로 하며, 팩토리의 경우 제거만 하면 소스 클래스 이름이 계산됩니다. Factory 접미사, 그럴거야 Magento\Quote\Api\Data\CartItemExtension.이 클래스는 존재하지 않으며 자동 생성은 자동 로더에 의해 다시 한 번 호출되지만 이번에는 Extension 클래스에 대한 것입니다.
  4. 이제 접미사는 Extension 그리고 \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator 이 클래스를 생성하는 데 사용됩니다
  5. 확장 클래스 생성을 위한 소스 클래스는 다음과 같이 계산됩니다. Magento\Quote\Api\Data\CartItemInterface, 존재하고 확장 클래스가 성공적으로 생성되었습니다.그러나 Extension 클래스 파일을 포함하려고 하면 자동 생성이 다시 한 번 트리거됩니다. 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가 생성됩니다.

한 가지 중요한 점은 ExtensionInterface에 대한 기본 설정이 없다는 것입니다. di.xml Extension과 ExtensionInterface가 모두 자동 생성되기 때문입니다.ExtensionInterface는 구문을 통해 직접 주입될 것으로 예상되지 않으므로 이는 문제가 되지 않습니다.

다른 팁

오늘 밤 @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라는 함수가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top