คลาสใดที่“ สามารถสกัดกั้น / ปลั๊กอินได้” ใน Magento 2


17

วันที่: 30 พฤษภาคม 2558 (ตามลักษณะของ Magento 2 ที่เปลี่ยนแปลงไป)

วีโอไอพี 2 แนะนำแนวคิดปลั๊กอินที่ดำเนินการผ่านทางรูปแบบการสกัดกั้น

มีอะไรไม่ชัดเจนจากเอกสาร - คลาสและวัตถุใดใน Magento ที่ "สามารถดักจับ" ได้ นั่นคือคุณกำหนดค่าปลั๊กอินด้วย XML ที่มีลักษณะดังนี้

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

ObservedTypeแต่ก็ไม่ชัดเจนซึ่งการเรียนที่ถูกต้องในฐานะที่เป็น นี้บทความวิกิพีเดียเก่าให้เบาะแสบางอย่างเมื่อมันพูดว่า

โปรดทราบว่าคุณสมบัติปลั๊กอินไม่สามารถใช้ได้กับ - คลาสที่สร้างโดยไม่ต้องพึ่งพาการฉีดนั่นคือสร้างด้วยโอเปอเรเตอร์ใหม่โดยตรง - วิธีการสุดท้าย, - คลาสสุดท้าย

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

ส่วนใหญ่พยายามที่จะทำให้ฉันเข้าใจสิ่งที่ทำได้และไม่สามารถทำได้ด้วยเครื่องดักฟัง Magento 2 ก่อนที่ฉันจะเริ่มใช้มัน

คำตอบ:


10

ทุกระดับของโมดูลวีโอไอพีนั้นสามารถปรับเปลี่ยนได้

ดังที่อธิบายไว้ในวิกิปัจจุบันมันถูก จำกัด ด้วยวิธีการและคลาสสุดท้าย

ไม่ผ่านการตรวจสอบ แต่คลาสของไลบรารี (ไดเรกทอรี lib) คือ (/ ควร) ไม่ได้รับอนุญาตให้ถูกดักข้อมูล

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


2
เราไม่มีข้อ จำกัด สำหรับการสกัดกั้นคลาส lib นอกจากนี้สำหรับวัตถุที่จะดักจับได้จะต้องสร้างขึ้นด้วย ObjectManager (ตัวสร้างการสร้าง)
Anton Kril

1
ควรสังเกตว่าวิธีการเวทย์มนตร์ (แต่ประกาศโดยใช้ phpdoc) ไม่สามารถดักจับได้ ฉันคิด. ลักษณะ Varien_Object ยังคงมีอยู่ในบางสถานที่
nevvermind

11

เรากำลังทำงานกับคำอธิบายประกอบ "@api" เพื่อใส่คำอธิบายประกอบวิธีที่แนะนำให้มีเสถียรภาพมากขึ้นในการเผยแพร่ หากคุณกังวลเกี่ยวกับการอัพเกรดได้นอกเหนือจากสิ่งที่สามารถกำหนดปลั๊กอินได้คุณควรพิจารณาว่าควรมีปลั๊กอินใดที่กำหนดไว้ เราไม่แนะนำให้มีการสกัดกั้นวิธีที่ไม่ใช่ @ api แต่บางครั้งเรารู้ว่าอาจเป็นตัวเลือกที่ดีที่สุด (เราปล่อยให้เป็นดุลยพินิจของนักพัฒนา)

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


5

ฉันรู้ว่านี่มีคำตอบแล้ว แต่มาจาก 2 ปีที่แล้ว อาจมีบางอย่างเปลี่ยนแปลงไปในระหว่างนี้

นี่คือสิ่งที่ฉันค้นพบ
จากเอกสารอย่างเป็นทางการและจากการขุดเข้าไปในกระบวนการสกัดกั้น

ฉันจะตอบวิธีอื่น ๆ
สิ่งที่ไม่สามารถดักจับใน Magento 2 ได้
จากเอกสารอย่างเป็นทางการ

  • วัตถุที่สร้างอินสแตนซ์ก่อน Magento \ Framework \ Interception ถูก bootstrapped (ไม่แน่ใจว่าจุดนั้นอยู่ที่ใด)
  • วิธีการขั้นสุดท้าย
  • วิธีใดก็ได้จากคลาสสุดท้าย (เพราะคลาส interceptor ที่สร้างขึ้นต้องขยายคลาสเดิม)
  • คลาสใด ๆ ที่มีวิธีสาธารณะขั้นสุดท้ายอย่างน้อยหนึ่งวิธี
  • วิธีการที่ไม่ใช่แบบสาธารณะ (สามารถใช้ได้กับวิธีที่ได้รับการป้องกัน แต่นี่ไม่ใช่ "จริยธรรม" เพราะมันจะเปิดเผยวิธีการที่ไม่ใช่แบบสาธารณะสู่ภายนอกห้องเรียน)
  • วิธีการคงที่
  • __สร้าง
  • ประเภทเสมือน

จากการขุดไปรอบ ๆ

  • วิธีการในชั้นเรียนที่ไม่ได้ยกตัวอย่างผ่านทางผู้จัดการวัตถุ (ตัวอย่าง\Magento\Framework\Phrase)
  • \Magento\Framework\ObjectManager\NoninterceptableInterfaceคลาสการใช้ (ตัวอย่างเช่น\Magento\Framework\App\Cache\Proxyและผู้รับมอบฉันทะอัตโนมัติอื่น ๆ ทั้งหมด)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.