Làm thế nào để Magento2 tạo ra ExtensionFactory và ExtensionAttributionInterface cụ thể?


28

Tôi muốn quấn đầu bằng cách sử dụng các thuộc tính mở rộng, ví dụ cho các mục trích dẫn.
Không có vấn đề gì khi thêm một thuộc tính tùy chỉnh vào một thực thể như vậy bằng cách sử dụng lớp thiết lập như trong Magento 1, đây không phải là câu hỏi này.
Hiện tại, phép thuật áp đảo tôi khi tôi muốn phơi bày một thuộc tính như vậy đã được thêm bởi một tiện ích mở rộng thông qua API thực thể dưới dạng một thuộc tính mở rộng.

CẬP NHẬT : Tôi biết làm thế nào các nhà máy thường xuyên được tạo ra. Câu hỏi này là về các nhà máy đặc biệt khởi tạo các triển khai được tạo cho các giao diện thuộc tính mở rộng được tạo.

Dưới đây là các bước tôi thực hiện để làm cho nó hoạt động. Tôi đang thêm những điều này để bất cứ ai cố gắng trả lời không cần phải đi sâu vào những chi tiết đó.
Câu hỏi của tôi là LÀM THẾ NÀO hoặc TẠI SAO nó hoạt động.

Các bước để hiển thị một thuộc tính mở rộng thông qua API thực thể:

  1. Tạo một etc/extension_attributes.xmlthuộc tính thêm thuộc tính vào giao diện thực thể
  2. Tạo một plugin để thêm giá trị thuộc tính vào thể hiện thực ExtensionAttributesthể.

Để làm điểm thứ hai, ExtensionAttributescần có thực thể. Vì lý do này, plugin phụ thuộc vào một nhà máy mà trình quản lý đối tượng cung cấp thông qua DI.

Đối với ví dụ mục trích dẫn Magento\Quote\Api\Data\CartItemExtensionFactoryphải được sử dụng.
Tôi đoán loại nhà máy này bằng cách nào đó phải là tác nhân kích hoạt ma thuật thế hệ.

Magento sau đó tạo giao diện phù hợp \Magento\Quote\Api\Data\CartItemExtensionInterfacevới setters và getters cho tất cả các thuộc tính mở rộng.
Tuy nhiên, nó dường như không tạo ra việc triển khai cụ thể cho giao diện đó. Tại cho thuê PHPStorm không nhìn thấy nó.

Làm thế nào để Magento thu thập thông tin cần thiết để tạo ra lớp? Làm thế nào các phương thức giao diện được tạo có thể được gọi trên một ví dụ cụ thể? Đây có phải là một lớp chỉ được tạo trong bộ nhớ không?

Tôi rất vui vì nó hoạt động, nhưng điều đó không thực sự thỏa mãn. Khả năng Magentos sử dụng các thuộc tính được tạo tự động bởi các tiện ích mở rộng là một yếu tố quan trọng dẫn đến thành công của nó. Là một nhà phát triển mô-đun, tôi tin rằng tôi cần một sự hiểu biết thấu đáo về toàn bộ quá trình.
Tôi có nên dành thời gian cho bản thân mình không, nhưng tôi thích nếu tôi có thể giải thích.

CẬP NHẬT 2 : Mất một ít thời gian để đọc qua \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator\Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator. Bây giờ tôi ít nhất có một ý tưởng sơ bộ những gì đang xảy ra. Nếu không ai đánh bại tôi, tôi sẽ viết một mô tả về toàn bộ quá trình tại một thời điểm, vì tôi nghĩ đó sẽ là một tài liệu tham khảo hữu ích.


2
Vinai đã làm .. hỏi câu hỏi ..Omg
Amit Bera

Câu trả lời:


26

Trước hết autogeneration đang xảy ra dựa trên tên lớp hậu tố, ví dụ như Factory, ExtensionInterface(xem \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::EXTENSION_INTERFACE_SUFFIX) hoặc Extension(xem \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator::EXTENSION_SUFFIX).

Máy phát điện thích hợp được chọn dựa trên hậu tố ở đây \Magento\Framework\Code\Generator::generateClass.

Giả sử chế độ Magento là developervà các lớp bị thiếu có thể được tạo khi đang bay (quá trình tương tự sẽ xảy ra khi trình biên dịch được sử dụng). Khi trình quản lý đối tượng cố gắng khởi tạo hãy nói Magento\Quote\Api\Data\CartItemExtensionFactoryvà nó không tồn tại, điều sau đây xảy ra:

  1. Trình tải tự động không thể khởi tạo lớp và bắt đầu tạo mã tại đây \Magento\Framework\Code\Generator\Autoloader::load
  2. Sau đó, hậu tố lớp được xác định là Factory(danh sách tất cả các hậu tố được khai báo có thể được tìm thấy ở đây \Magento\Framework\ObjectManager\DefinitionFactory::getCodeGenerator) và lớp trình tạo Factory tương ứng ( Magento\Framework\ObjectManager\Code\Generator\Factory) được sử dụng để tạo ra nhà máy bị thiếu
  3. Tất cả các lớp được tạo tự động luôn dựa trên các lớp khác, trong trường hợp xuất xưởng, tên lớp nguồn được tính chỉ bằng cách loại bỏ Factoryhậu tố, nó sẽ được Magento\Quote\Api\Data\CartItemExtension. Lớp này không tồn tại và tự động phát sinh được gọi lại một lần nữa bởi trình tải tự động, nhưng lần này là cho lớp Mở rộng
  4. Bây giờ hậu tố đang Extension\Magento\Framework\Api\Code\Generator\ExtensionAttributesGeneratorsẽ được sử dụng để tạo lớp này
  5. Lớp nguồn để tạo lớp Mở rộng được tính như Magento\Quote\Api\Data\CartItemInterface, nó tồn tại và Lớp mở rộng được tạo thành công. Tuy nhiên, trên nỗ lực bao gồm tệp lớp Mở rộng, tự động phát lại được kích hoạt một lần nữa vì Magento\Quote\Api\Data\CartItemExtensionthực hiện Magento\Quote\Api\Data\CartItemExtensionInterface, không tồn tại
  6. Hậu tố đang ExtensionInterface\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGeneratorsẽ được sử dụng cho thế hệ
  7. Các lớp ExtensionInterface và Extension được tạo dựa trên thông tin từ extension_attributes.xml, có thể truy cập thông qua \Magento\Framework\Api\ExtensionAttribute\Config, sau đó Factory được tạo

Một lưu ý quan trọng là không có ưu tiên cho ExtensionInterface di.xmlvì cả Tiện ích mở rộng và Mở rộng đều được tự động tạo. Đây không phải là một vấn đề vì ExtentionInterface dự kiến ​​sẽ không được tiêm trực tiếp thông qua cấu trúc.


@Vinai bạn được chào đón. Bounty là một bất ngờ tốt đẹp, cảm ơn. Cập nhật: chỉ FYI, nếu tiền thưởng được bắt đầu sau khi câu trả lời đã được chấp nhận, nó không được trao tự động.
Alex Paliarush

0

Đối với tôi, tối nay, trên đầu câu trả lời từ @Alex, tôi có thể thấy các dòng

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

trong lớp \Magento\Framework\Api\ExtensionAttributesFactory

là nơi chúng ta có thể muốn bắt đầu gỡ lỗi nếu giao diện mở rộng không được tạo. Khá nhiều thuộc tính mở rộng là về cấu trúc lớp của chúng tôi như Magento 2 sẽ mong đợi.

những dòng này đang nói:

  • là lớp trong phần mở rộng của chúng tôi

  • nó có mở rộng \ Magento \ Framework \ Api \ ExtensibleDataInterface

  • Giao diện này có một chức năng gọi là getExtensionAttribut

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.