Drupal จัดการกับการโหลดคลาสอัตโนมัติอย่างไร


10

Drupal จัดการกับการโหลดคลาสอัตโนมัติผ่านโมดูลได้อย่างไร ตัวอย่างเช่นถ้าฉันมีโมดูลกิจกรรมและฉันประกาศคลาสที่เรียกว่าเหตุการณ์แล้วในไฟล์. info ฉันรวมไฟล์คลาสไว้การลงทะเบียนนี้เป็นอย่างไร

ปัญหาคือฉันพยายามหาอาร์เรย์ที่มีชื่อคลาสที่โหลดทั้งหมด get_declared_classes ()ไม่ส่งคืนชื่อของคลาสทั้งหมดของฉันที่ประกาศในลักษณะนี้ดังนั้นฉันสมมติว่ามันถูกโหลดอัตโนมัติอย่างใด ทำตามคำแนะนำจากคำถามล้นสแต็คอื่นฉันลองรับทั้งหมดด้วยspl_autoload_functions ()แต่นั่นก็ไม่สำเร็จเช่นกัน

ความคิดใด ๆ

คำตอบ:


13

ไฟล์ทั้งหมดที่แสดงรายการในไฟล์. info จะถูกวิเคราะห์คำเมื่อโมดูลถูกสร้างใหม่ (เฉพาะไฟล์ที่เปลี่ยนแปลง / ใหม่ในรายการนั้นเพื่อเหตุผลด้านประสิทธิภาพ)

ข้อมูลนั้นจะถูกเก็บไว้ใน{registry}และ{registry_files}ตาราง ดังนั้นหากคุณต้องการรับคลาสทั้งหมดหรือตามคลาสการตั้งชื่อที่กำหนดคุณสามารถเคียวรีตารางเหล่านั้นได้


7

Drupal ดูแลรหัสรีจิสตรีและใช้สำหรับการโหลดอัตโนมัติของคลาส ในการเติมรีจิสตรีนี้ด้วยคลาสของโมดูลคุณควรเพิ่มไฟล์ลงในรายการไฟล์ [] ในไฟล์. info ของมัน:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

การโหลดคลาสอัตโนมัติของ PHP จะทำให้แน่ใจว่าโหลดคลาสพาเรนต์ด้วย

เพิ่มเครดิตให้แก่ผู้ใช้คำตอบนี้ดูคำตอบเดิมของเขาที่นี่สำหรับคำถามเดียวกัน

หวังว่าจะช่วย


5

spl_autoload_functions()ส่งคืนรายการฟังก์ชัน autoload ที่ลงทะเบียนspl_autoload_register()แล้ว Drupal ลงทะเบียนฟังก์ชัน autoload สองฟังก์ชัน: หนึ่งฟังก์ชันสำหรับคลาส ( drupal_autoload_class () ) และอีกหนึ่งฟังก์ชันสำหรับอินเตอร์เฟส ( drupal_autoload_interface () )

ทั้งสองฟังก์ชั่นใช้_registry_check_code () ; ใช้รหัสของมันคุณสามารถเขียนฟังก์ชั่นที่แสดงรายการคลาสทั้งหมดที่นำมาใช้โดยโมดูล Drupal 7


3

หากคุณได้เพิ่มรายการลงในไฟล์ [] อาร์เรย์ของไฟล์. info คุณจะต้องไปที่ส่วนการบริหารโมดูลของคุณและคลิกที่ "บันทึกการกำหนดค่า" จะได้รับ drupal เพื่อรีเฟรชข้อมูล. info และรายการใหม่จะถูกลงทะเบียน


1

ฉันพบว่าการประกาศไฟล์รวมของฉันในไฟล์ข้อมูลไม่ได้รับการยอมรับเมื่อฉันเริ่มเรียกใช้โมดูล ถ้าฉันมีคลาสกิจกรรมในไฟล์ event.inc แต่จะทำให้วัตถุในโมดูลไม่สามารถจดจำได้ ฉันเพิ่มบรรทัด

include_once ('CMatArticleHandler.inc');

ก่อนหน้า $ ตัวแปร = เหตุการณ์ใหม่ (); ไลน์. ฉันใหม่ที่นี้ดังนั้นอาจจะมีมากกว่านี้แล้ว แต่มันได้ทำงานจนถึง


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

หนึ่งต้องล้างรีจิสทรีเมื่อเพิ่มคลาสใหม่ วิธีง่ายๆในการทำ othis ผ่าน drush คือด้วยคำสั่งนี้: drupal.org/project/registry_rebuild
stefgosselin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.