Magento2 สร้างส่วนขยายเฉพาะจากโรงงานและ ExtensionAttributeInterface ได้อย่างไร


28

ฉันต้องการห่อหัวของฉันไปรอบ ๆ โดยใช้คุณลักษณะส่วนขยายตัวอย่างเช่นสำหรับรายการราคา
ไม่มีปัญหาในการเพิ่มแอตทริบิวต์ที่กำหนดเองให้กับเอนทิตี้ดังกล่าวโดยใช้คลาสการตั้งค่าเช่นเดียวกับใน Magento 1 นี่ไม่ใช่สิ่งที่คำถามนี้เกี่ยวกับ
ในขณะที่เวทย์มนตร์ครอบงำฉันเมื่อฉันต้องการที่จะเปิดเผยคุณลักษณะดังกล่าวที่ถูกเพิ่มโดยส่วนขยายผ่านเอนทิตี API เป็นแอตทริบิวต์ส่วนขยาย

ปรับปรุง : ฉันรู้วิธีการสร้างโรงงานปกติ คำถามนี้เกี่ยวกับโรงงานพิเศษที่สร้างอินสแตนซ์ของการใช้งานที่สร้างขึ้นสำหรับอินเตอร์เฟสส่วนขยายที่สร้างขึ้น

นี่คือขั้นตอนที่ฉันต้องทำเพื่อให้มันใช้ได้ ฉันกำลังเพิ่มสิ่งเหล่านี้ดังนั้นผู้ที่พยายามตอบคำถามไม่จำเป็นต้องลงรายละเอียดเหล่านั้น
คำถามของฉันคือวิธีการหรือทำไมมันทำงาน

ขั้นตอนในการเปิดเผยแอตทริบิวต์ส่วนขยายผ่านเอนทิตี API:

  1. สร้างetc/extension_attributes.xmlที่เพิ่มคุณสมบัติให้กับส่วนติดต่อนิติบุคคล
  2. สร้างปลั๊กอินเพื่อเพิ่มค่าคุณลักษณะให้กับExtensionAttributesอินสแตนซ์เอนทิตี

ในการทำจุดที่สองExtensionAttributesจำเป็นต้องใช้อินสแตนซ์เอนทิตี ด้วยเหตุนี้ปลั๊กอินจึงขึ้นอยู่กับโรงงานซึ่งตัวจัดการวัตถุส่งผ่าน DI

สำหรับตัวอย่างรายการที่Magento\Quote\Api\Data\CartItemExtensionFactoryจะต้องมีการใช้
ฉันเดาว่าประเภทของโรงงานนี้จะต้องเป็นตัวกระตุ้นให้เกิดเวทย์มนตร์

วีโอไอพีจะสร้างส่วนต่อประสานการจับคู่\Magento\Quote\Api\Data\CartItemExtensionInterfaceกับ setters และ getters สำหรับคุณลักษณะส่วนขยายทั้งหมด
อย่างไรก็ตามดูเหมือนจะไม่สร้างการใช้งานที่เป็นรูปธรรมสำหรับอินเทอร์เฟซนั้น ที่ให้เช่า PHPS รูปแบบไม่เห็น

วีโอไอพีรวบรวมข้อมูลที่จำเป็นในการสร้างชั้นเรียนได้อย่างไร? วิธีการอินเตอร์เฟสที่สร้างขึ้นสามารถถูกเรียกบนอินสแตนซ์ที่เป็นรูปธรรมได้อย่างไร มันเป็นคลาสที่เพิ่งถูกสร้างขึ้นในหน่วยความจำเท่านั้น?

ฉันมีความสุขที่ได้ผล แต่ก็ไม่เป็นที่น่าพอใจ ความสามารถของ Magentos ในการใช้คุณสมบัติที่สร้างขึ้นโดยอัตโนมัติโดยส่วนขยายเป็นปัจจัยสำคัญประการหนึ่งต่อความสำเร็จ ในฐานะนักพัฒนาโมดูลฉันเชื่อว่าฉันต้องเข้าใจกระบวนการทั้งหมดอย่างถี่ถ้วน
ฉันควรจะมีเวลาหรือเปล่าที่ฉันจะขุดมันด้วยตัวเอง แต่ฉันอยากได้ถ้าฉันจะได้รับคำอธิบาย

UPDATE 2 : เอาเวลาน้อยในการอ่านและ\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator \Magento\Framework\Api\Code\Generator\ExtensionAttributesGeneratorอย่างน้อยตอนนี้ฉันมีความคิดคร่าวๆว่าเกิดอะไรขึ้น หากไม่มีใครชนะฉันฉันจะเขียนคำอธิบายของกระบวนการทั้งหมด ณ จุดหนึ่งเพราะฉันคิดว่ามันจะเป็นข้อมูลอ้างอิงที่มีประโยชน์


2
The Vinai .. ถามคำถาม .. อ๊อกซิม
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. Autoloader ไม่สามารถยกตัวอย่างคลาสและเริ่มต้นการสร้างรหัสได้ที่นี่ \Magento\Framework\Code\Generator\Autoloader::load
  2. จากนั้นกำหนดส่วนต่อท้ายคลาสเป็นFactory(รายการของส่วนต่อท้ายที่ประกาศทั้งหมดสามารถดูได้ที่นี่\Magento\Framework\ObjectManager\DefinitionFactory::getCodeGenerator) และคลาสตัวสร้าง Factory ที่สอดคล้องกัน ( Magento\Framework\ObjectManager\Code\Generator\Factory) ถูกใช้เพื่อสร้างโรงงานที่ขาดหายไป
  3. เรียน autogenerated ทั้งหมดจะขึ้นอยู่เสมอในชั้นเรียนอีกในกรณีของโรงงานชื่อแหล่งชั้นที่มีการคำนวณเพียงโดยการเอาคำต่อท้ายก็จะเป็นFactory Magento\Quote\Api\Data\CartItemExtensionคลาสนี้ไม่มีอยู่และมีการเรียกอัตโนมัติอัตโนมัติอีกครั้งโดย autoloader แต่คราวนี้เป็นคลาสเสริม
  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 ถูกสร้างอัตโนมัติ นี่ไม่ใช่ปัญหาเนื่องจาก ExtentionInterface ไม่คาดว่าจะถูกฉีดผ่านการสร้างโดยตรง


@Vinai ยินดีต้อนรับ เงินรางวัลเป็นเซอร์ไพรส์ที่ดีขอบคุณ อัปเดต: เพียงแค่ FYI หากเงินรางวัลเริ่มต้นหลังจากคำตอบที่ได้รับการตอบรับจะไม่ได้รับรางวัลโดยอัตโนมัติ
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_attribute ส่วนต่อประสานของเรา

  • มันขยาย \ Magento \ Framework \ Api \ ExtensibleDataInterface

  • มีอินเตอร์เฟสนี้ฟังก์ชันที่เรียกว่า getExtensionAttributes

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.