สิ่งที่กระตุ้นให้เกิดการสร้างโรงงานใน Magento 2


39

Magento 2 มีไฟล์คลาสจำนวนหนึ่งที่สร้างไว้ล่วงหน้าหรือสร้างขึ้นทันที พวกเขาอาศัยอยู่ใน

var/generated

ไฟล์ที่สร้างขึ้นเหล่านี้รวมถึงคลาสของโรงงาน จากเอกสารฉันเข้าใจว่าโปรแกรมเมอร์ใช้คลาสโรงงานเพื่ออินสแตนซ์วัตถุ "ที่ไม่สามารถฉีดได้" วัตถุ "ที่ไม่สามารถฉีดได้" เป็นวัตถุที่ไม่สามารถเพิ่มผ่าน__constructorการฉีดตามปกติเนื่องจากต้องให้ผู้ใช้ป้อนอินสแตนซ์

สิ่งที่ไม่ชัดเจนจากเอกสารประกอบคือวีโอไอพี 2 รู้ว่ามันต้องการสร้างคลาสโรงงาน บิตนี้

หากตัวจัดการวัตถุที่พบไม่มีอยู่ในโหมดรันไทม์หรือคอมไพเลอร์ตัวจัดการวัตถุจะสร้างโรงงาน

ทำให้ดูเหมือนว่าถ้าฉันใช้คลาสโรงงานในตัวจัดการวัตถุ (หรือโดยการขยายในการพึ่งพา __ คอนสตรัคชันการฉีด) สิ่งที่วีโอไอพี 2 จะสร้างขึ้นมาเพื่อฉัน แต่ผู้จัดการวัตถุจะรู้ได้อย่างไรว่าสิ่งที่ฉันขอเป็นโรงงานหรือไม่

นอกจากนี้ดูเหมือนว่าจะมีสอง คำสั่งสำหรับการสร้างโดยอัตโนมัติ (หรือ "รวบรวม") คลาสที่สร้างขึ้นทั้งหมด การรันคำสั่งอย่างใดอย่างหนึ่งเหล่านี้จะสร้างคลาส Factory จำนวนมาก ไฟล์คำสั่งกำหนดค่าและ / หรือไฟล์ใดที่คำสั่งเหล่านี้มองหาเพื่อสร้างวัตถุที่ต้องการจากโรงงาน?

ฉันรู้ว่าการติดตามตัวจัดการวัตถุและ / หรือรหัสคำสั่งทุกอย่างจะเปิดเผยสิ่งนี้ แต่ฉันหวังว่าจะหลีกเลี่ยงการเดินทางที่ยาวนานและลำบาก

คำตอบ:


21

ตำแหน่งโค้ดที่น่าสนใจสำหรับวิธีการทำงานร่วมกันทั้งหมด: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

ด้วยประเภทที่แตกต่างกันส่วนใหญ่มาจากที่นี่ https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generatorแต่จากที่นี่https://github.com/magento / magento2 / ต้นไม้ / พัฒนา / lib / ภายใน / Magento / กรอบ / การสกัดกั้น / รหัส / เครื่องกำเนิดสำหรับรหัสการสกัดกั้น

มันถูกทริกเกอร์โดยผู้โหลดอัตโนมัติที่นี่https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

ฉันไม่พบในรหัสเงื่อนไขที่โรงงานถูกสร้างขึ้น แต่จากความเข้าใจของฉันคลาสโรงงานถูกสร้างขึ้นเมื่อมีการร้องขอและไม่พบ
มีคำหลักที่สงวนไว้บางส่วนFactory, Proxy, Interceptorหากใช้จะทำให้เกิดการสร้างรหัสเมื่อไม่พบคลาสที่ต้องการ
ฉันจะโพสต์กลับทันทีที่ฉันพบรหัสที่ก่อให้เกิดการสร้างโรงงาน
ดังนั้นหากคุณขอคลาสSome\Namespace\HereFactoryและไม่มีคลาสเนื่องจากมันลงท้ายด้วยคำสำคัญFactoryมันจะถูกสร้างขึ้นในvar/generation/Some/Namespace/HereFactory.php


ดูเหมือนว่าเอกสารควรได้รับการอัปเดตเนื่องจาก ObjectManager ไม่ใช่รุ่นที่สร้างขึ้นจริงๆ โหลดอัตโนมัติพิเศษเป็นส่วนหนึ่งของคำตอบ github.com/magento/magento2/blob/develop/lib/internal/Magento/ …
Chris O'Toole

1
สิ่งนั้นสอดคล้องกับประสบการณ์ของฉัน (ดู gist.github.com/astorm/f245ce9c761c9a8053aa) แต่มันทำให้เกิดคำถามขึ้น 1 สิ่งนี้เกิดขึ้นในโค้ดตัวจัดการวัตถุ (เช่นสิ่งที่เป็นรูปแบบจริง) 2. คอมไพเลอร์ / เครื่องกำเนิดไฟฟ้ารู้ว่าสิ่งที่โรงงานที่จะสร้าง?
Alan Storm

8

ฉันกำลังขุดในซุปถั่วเดียวกันนี้ตอนนี้ ความเข้าใจของฉันจนถึงตอนนี้ก็คือทุกสิ่งที่สร้างขึ้นโดยอัตโนมัติ/var/generationนั้นทำจากการตั้งค่าและอินเทอร์เฟซที่ประกาศapp/etc/di.xmlไว้

การเชื่อมต่อและการตั้งค่าของคุณจะได้รับการประกาศในแฟ้มในของคุณdi.xml/app/code/Vendor/<module>/etc/di.xml

มันรู้ที่จะสร้างวัตถุสำหรับคุณเพราะคุณได้ประกาศอินเทอร์เฟซในของคุณ__constructorและได้ประกาศการตั้งค่าสำหรับอินเทอร์เฟซนั้นทั้งส่วนกลางหรือภายในในdi.xmlแฟ้มที่เหมาะสม

ฉันเสนอความคิดเห็นของฉันสามเม็ด


+1 สำหรับข้อมูลที่เป็นประโยชน์ - แต่ดูเหมือนว่าโรงงานมาจากที่อื่นนอกจากdi.xmlไฟล์ - คุณสามารถส่งบางสิ่งไปยังตัวจัดการวัตถุที่ลงท้ายด้วย Factory และมันจะสร้างไฟล์ให้คุณ
อลันสตอร์ม

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