Magento2 - ตั้งค่า: di: รวบรวม


12

ฉันทำงานในโครงการที่มีรหัสที่กำหนดเอง ... นี่เป็นโครงการ "สื่อกลาง" Magento 2 ครั้งแรกของเราดังนั้น (เพราะทุกคนที่นี่ฉันคิดว่า) ทุกวันที่เราเรียนรู้สิ่งใหม่และเราต้องเปลี่ยนวิธีจัดการ กับเวอร์ชั่นใหม่ของ Magento

เหตุผลสำหรับคำถามนี้คือการถามเกี่ยวกับคำสั่ง setup:di:compile

ฉันใช้มันมาตั้งแต่วันแรกกับ Magento 2 ในขณะที่ bin / magento ขอให้ทุกคนsetup:upgradeพร้อมกับข้อความ"โปรดเรียกใช้คำสั่งรวบรวม Magento อีกครั้ง"

ดี ... ฉันได้พบว่าการดำเนินการsetup:di:compileแบ่งหน้าดูผลิตภัณฑ์ในโครงการนี้ด้วยข้อผิดพลาดร้ายแรงที่ไม่ชัดเจนทั้งหมด ฉันใช้เวลาทั้งวันในการพยายามแก้ไขข้อบกพร่องและทดสอบกับการเปลี่ยนรหัสโดยไม่มีผลลัพธ์

วันนี้ฉันได้ค้นพบว่าถ้าฉันไม่ใช้คำสั่งนั้นทุกอย่างก็ใช้งานได้อย่างมีเสน่ห์แม้ในโหมดการผลิต

ดังนั้นคำถามคือ ... setup:di:compileคำสั่งนั้นทำอะไรกันแน่? จำเป็นหรือไม่ เพิ่งแนะนำ หรือเป็นคำสั่งที่เลิกใช้แล้วซึ่งไม่จำเป็นต้องดำเนินการ

UPDATE

เนื่องจากผู้ใช้บางรายจำเป็นต้องใช้นี่เป็นข้อผิดพลาดร้ายแรงที่ฉันอ้างถึง

ข้อผิดพลาดร้ายแรงของ PHP: ไม่สามารถยกตัวอย่างคลาส Magento \ Catalog \ Block \ Product \ View \ AbstractView ใน *** / ผู้ขาย / magento / กรอบ / ObjectManager / โรงงาน / AbstractFactory.php ในบรรทัด 93

ฉันค้นหาบล็อกที่กำหนดเองใด ๆ โดยใช้ Magento \ Catalog \ Block \ Product \ View \ AbstractView แต่ฉันพบเฉพาะในไฟล์เลย์เอาต์มันไม่ปรากฏในตัวสร้างคลาสบล็อกใด ๆ

สิ่งที่ฉันไม่เข้าใจคือทำไมวีโอไอพีโยนข้อผิดพลาดร้ายแรงนี้ด้วยรหัสที่คอมไพล์แล้ว


คุณสามารถยืนยันได้หรือไม่ว่า 'การตั้งค่า: di: การคอมไพล์' ทำให้เกิดข้อผิดพลาดในการดูผลิตภัณฑ์ในโหมดการพัฒนาด้วยหรือไม่
paj

ใช่ข้อผิดพลาดร้ายแรงเกิดขึ้นในทั้งสองโหมด
ราอูลซานเชซ

คุณสามารถโพสต์ข้อความ "ข้อผิดพลาดร้ายแรงที่คลุมเครือ" ได้หรือไม่
ชุดนอน

ฉันได้อัปเดตคำถามที่มีข้อผิดพลาด ขอบคุณ
Raul Sanchez

คำตอบ:


21

คำสั่งsetup:di:compilecommand สร้างเนื้อหาของvar/diโฟลเดอร์ใน Magento <2.2 และgenerated สำหรับ Magento> = 2.2

ตาม Magento นี้ทำหน้าที่วัตถุประสงค์ดังต่อไปนี้:

  • การสร้างรหัสแอปพลิเคชัน (โรงงานพร็อกซีและอื่น ๆ )
  • การรวมการกำหนดค่าพื้นที่ (นั่นคือการเพิ่มประสิทธิภาพการกำหนดค่าการฉีดพึ่งพาต่อพื้นที่)
  • การสร้าง Interceptor (นั่นคือการสร้างโค้ดที่ปรับให้เหมาะสมของ interceptors)
  • การสร้างแคชสกัดกั้น
  • การสร้างรหัสที่เก็บ (นั่นคือรหัสที่สร้างขึ้นสำหรับ API)
  • การสร้างแอตทริบิวต์ข้อมูลบริการ (นั่นคือสร้างคลาสส่วนขยายสำหรับวัตถุข้อมูล)

แหล่งข้อมูล ( http://devdocs.magento.com/guides/v2.0/config-guide/cli/config-cli-subcommands-compiler.html )

อย่างไรก็ตามเมื่อคุณวาง Magento ในโหมดการผลิตโดยไม่ต้องรวบรวมมันยังคงใช้งานได้จริง ดังนั้นตามเอกสารวีโอไอพีนี้เป็นขั้นตอนการเพิ่มประสิทธิภาพมากขึ้น(นั่นคือการสร้างรหัสที่ดีที่สุดของ interceptors)

เมื่อเรามีข้อผิดพลาดในsetup:di:compileคำสั่งส่วนใหญ่เป็นเพราะข้อผิดพลาดในหนึ่งในตัวสร้างของคลาส PHP ที่กำหนดเอง


1
ขอบคุณ! ดังนั้นมันเป็นทางเลือกโดยสิ้นเชิง ... เพียงแค่จุดเดียวดังนั้นมันชัดเจนมากขึ้นสำหรับฉัน ในกรณีของเราเซ็ตอัพ: di: การคอมไพล์ไม่มีข้อผิดพลาดใด ๆ คำสั่งจะสิ้นสุดลง มันคือเมื่อเรียกดูเว็บไซต์หลังจากคำสั่งเสร็จสิ้นเมื่อยิงข้อผิดพลาดร้ายแรงในหน้าดูผลิตภัณฑ์
Raul Sanchez

บางทีคุณสามารถโพสต์ข้อผิดพลาด? นั่นจะทำให้สิ่งที่ชัดเจนมากขึ้น
Tjitse

ฉันได้อัปเดตคำถามที่มีข้อผิดพลาด ขอบคุณ
Raul Sanchez

12

มันไม่ได้บังคับให้เรียกใช้setup:di:compileคำสั่งทุกครั้ง แต่ถ้าคุณทำการเปลี่ยนแปลงรหัสใด ๆ เป็นพิเศษด้วยวิธีการจากโรงงาน, พร็อกซี่, เพิ่มปลั๊กอินหรือการรวบรวมรหัสใด ๆ คุณจะต้องเรียกใช้คำสั่งนี้

รายละเอียดเพิ่มเติม

magento setup:di:compileเพื่อสร้างไฟล์ที่จำเป็น ตัวเลือกทั้งสองจบลงด้วยการสร้างชั้นเรียนในMAGENTO_ROOT/var/generation directory(หรือ/generatedถ้า Magento 2.2+)

คลาสใดที่ถูกสร้างขึ้น?

  1. โรงงาน
  2. ผู้รับมอบฉันทะ
  3. ปลั๊กอิน

โรงงาน

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

ผู้รับมอบฉันทะ

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

ปลั๊กอิน (ตัวดัก)

ปลั๊กอินเป็นกลไกการปรับแต่งหลักสำหรับ Magento 2 ไม่มีการเขียนคลาสอีกต่อไป อนุญาตให้คุณเชื่อมต่อและทำบางสิ่งบางอย่างก่อนหลังหรือรอบวิธีการสาธารณะใด ๆ ของแอปพลิเคชัน

เมื่อคุณเรียกใช้ setup: di: compile command มันทำสิ่งต่างๆด้านล่างนี้

การรวบรวมรหัสประกอบด้วยสิ่งต่าง ๆ ต่อไปนี้ตามลำดับที่ไม่มี:

  • การสร้างรหัสแอปพลิเคชัน (โรงงานพร็อกซีและอื่น ๆ )

  • การรวมการกำหนดค่าพื้นที่ (นั่นคือการเพิ่มประสิทธิภาพการกำหนดค่าการฉีดพึ่งพาต่อพื้นที่)

  • การสร้าง Interceptor (นั่นคือการสร้างโค้ดที่ปรับให้เหมาะสมของ interceptors)

  • การสร้างแคชการสกัดกั้นการสร้างรหัสที่เก็บ (นั่นคือรหัสที่สร้างขึ้นสำหรับ API)

  • การสร้างแอตทริบิวต์ข้อมูลบริการ (นั่นคือสร้างคลาสส่วนขยายสำหรับวัตถุข้อมูล)

อ้างถึงคำตอบนี้เมื่อเราควรเรียกใช้คำสั่งใด: /magento//a/184927/35758


ขอบคุณ! ดังนั้นมันเป็นทางเลือกโดยสิ้นเชิง ... เพียงแค่จุดเดียวดังนั้นมันชัดเจนมากขึ้นสำหรับฉัน ในกรณีของเราเซ็ตอัพ: di: การคอมไพล์ไม่มีข้อผิดพลาดใด ๆ คำสั่งจะสิ้นสุดลง มันคือเมื่อเรียกดูเว็บไซต์หลังจากคำสั่งเสร็จสิ้นเมื่อมีการเรียกใช้ข้อผิดพลาดร้ายแรงในหน้ามุมมองผลิตภัณฑ์ ... ดังนั้นฉันจึงไม่เข้าใจว่าทำไมรหัสที่รวบรวมไม่ทำงานได้ดี แต่เมื่อรวบรวมแล้วข้อผิดพลาดร้ายแรงเกิดขึ้น
Raul Sanchez

สิ่งนี้สามารถเกิดขึ้นได้หากคลาสย่อยของคุณเพิ่มการอ้างอิงใหม่หลังจากการอ้างอิงทางเลือกที่มีอยู่ของคลาสพาเรนต์ คุณสามารถแก้ไขได้โดยย้ายพารามิเตอร์ที่ต้องการใหม่ขึ้นไปเหนือพารามิเตอร์ทางเลือก
เจ้าชาย Patel

2

วีโอไอพีจะยังคงทำงานในการผลิตและพัฒนาโดยไม่ต้องใช้คำสั่ง di: compile มันจะรวบรวม Interceptors ตามที่ต้องการและเก็บไว้ในgeneratedโฟลเดอร์

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

ฉันเชื่ออย่างยิ่งว่าข้อผิดพลาดนั้นเกิดจากการใช้คลาสที่วีโอไอพีไม่สามารถคอมไพล์ได้เนื่องจากข้อโต้แย้งของคอนสตรัคเตอร์ผิดพลาด

ข้อผิดพลาดที่คุณโพสต์คลุมเครือสวย แต่ฉันเชื่อว่าคุณมีคลาสที่ขยายที่AbstractViewระดับ 99% จะเป็นที่ไหนสักแห่งในบล็อกโมดูลที่กำหนดเองของคุณที่ไม่ผ่านการขัดแย้งที่ถูกต้องกับparent::__construct()วิธีการ ดังนั้นเมื่ออินสแตนซ์มันล้มเหลว

โปรดทราบว่าบล็อกทั้งหมดจะขยายคลาส AbstractView ดังนั้นคุณจะต้องดำเนินการคำสั่งคอมไพล์ด้วยxdebugเปิดและตั้งค่าการบันทึกที่ดูการติดตามสแต็กเพื่อดูว่าคลาสใดที่เรียกว่าคลาสสุดท้ายก่อนที่จะล้มเหลว

ความจริงที่ว่าเว็บไซต์ทำงานโดยไม่มีข้อผิดพลาดนั่นหมายความว่าคุณไม่ได้ใช้บล็อกที่เสียหายที่ใดก็ได้บนหน้าของคุณ แต่ Magento จะยังคงพยายามรวบรวมเมื่อเรียกใช้compileคำสั่งดังนั้นจึงล้มเหลว


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