Magento 2: ไฟล์ Interceptors ใน var / generation คืออะไร?


24

ดังนั้นฉันสังเกตเห็นบางInterceptor.phpไฟล์มาvar/generation

ฉันรู้ว่าโฟลเดอร์นี้มีชั้นเรียนที่สร้างขึ้นในทันทีสำหรับต่อไปนี้:

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

ฉันคิดว่าไฟล์ Interceptor นั้นเชื่อมโยงกับปลั๊กอิน แต่บางครั้งฉันก็ไม่เข้าใจว่าไฟล์เหล่านั้นถูกสร้างขึ้นมาอย่างไร ตัวอย่างเช่นฉันมีvar/generation/Magento/Framework/App/Response/Http/Interceptor.phpแต่ไฟล์นี้ดูเหมือนจะไม่ตรงกับชั้นเรียนที่มีอยู่ใด ๆ

ดังนั้นฉันกำลังมองหาเวิร์กโฟลว์อธิบายอย่างดีเกี่ยวกับวิธีสร้างไฟล์ Interceptor.php?

คำตอบ:


32

เรียน Interceptor มีการดำเนินการตามรูปแบบการออกแบบ interceptor interceptors มีวิธีวิธีวีโอไอพี 2 ระบบวัตถุดำเนินระบบปลั๊กอิน

ในฐานะนักพัฒนาไคลเอ็นต์ทฤษฎีคือคุณไม่จำเป็นต้องกังวลเกี่ยวกับตัวดัก - คุณถามตัวจัดการวัตถุเพื่อหาวัตถุประเภท X และมันส่งคืนให้คุณ วัตถุที่คุณถามอาจจะใช่หรือไม่ใช่ interceptor แต่จากมุมมองโปรแกรมเมอร์ของลูกค้ามันทำตัวเหมือนกับรุ่นที่ไม่ใช่ interceptor ตัวจัดการวัตถุตัดสินใจที่จะส่งคืนหรือไม่ส่งคืน interceptor ในรายละเอียดการนำไปปฏิบัติ

สำหรับผู้ที่สนใจในรายละเอียดการนำไปใช้งาน - ถ้าคลาสหรือคลาสพาเรนต์ของคลาสนั้นมีการกำหนดค่าปลั๊กอินตัวจัดการวัตถุจะส่งกลับ interceptor คุณจะเห็นว่าในคลาส interceptor โหมดผู้พัฒนาที่นี่

#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
    $type = parent::getInstanceType($instanceName);
    if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
        && $this->interceptableValidator->validate($instanceName)
    ) {
        return $type . '\\Interceptor';
    }
    return $type;
}

สำหรับการผลิต (เช่นโหมดที่คอมไพล์) วีโอไอพีจะสแกนระบบล่วงหน้าระหว่างโหมดการรวบรวมและทำการบันทึกว่าคลาสใดต้องใช้ปลั๊กอิน

Magento จัดการสิ่งนี้ด้วย PHP autoloader หากผู้พัฒนาสร้างคลาสขึ้นมาทันที (หรือเรียกใช้เหตุการณ์ PHP autoload ด้วยชื่อคลาส (ในคำใบ้ประเภทclass_existsคลาส ฯลฯ ) และออโต้โหลดที่ผู้แต่งใช้ไม่พบไฟล์คลาสเป็นออโต้โหลดที่ลงทะเบียนครั้งที่สอง

Magento\Framework\Code\Generator\Autoloader::load

ถูกทริกเกอร์ ออโต้โหลดนี้

vendor/magento/framework/Code/Generator/Autoloader.php

จะ (โดยอ้อมผ่านMagento\Framework\Code\Generatorคลาส) สแกนหาคลาสสำหรับรูปแบบการตั้งชื่อที่แน่นอน หากชื่อคลาสลงท้ายInterceptorด้วย Magento จะสร้าง Interceptor ด้วยgenerateClassวิธีการในคลาสนี้

vendor/magento/framework/Code/Generator.php

มีคลาส / วัตถุเพิ่มเติมเพื่อติดตามออกจากMagento\Framework\Code\Generator- แต่เราจะปล่อยให้เป็นแบบฝึกหัดสำหรับผู้อ่าน

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