ขณะนี้ฉันกำลังทำงานกับโมดูลที่ต้องใช้ไลบรารี PHP ของบุคคลที่สามซึ่งเป็นชั้น PHP เดียว โดยปกติฉันจะวางไว้ในรวม / ไดเรกทอรีย่อยและเพิ่ม
files[] = includes/Foo.php
ไปยังแฟ้ม .info ของฉันและให้อัตโนมัติระดับ Drupal 7 $foo = new Foo()
รถตักดินทำสิ่งที่ตนเมื่อฉันทำ
อย่างไรก็ตามฉันได้รับอนุญาตให้เผยแพร่โมดูลนี้สู่สาธารณะและไม่ต้องการรวมไลบรารีเข้ากับโมดูล ฉันตระหนักดีถึงความยุ่งยากเกี่ยวกับการออกใบอนุญาต แต่เพื่อคำถามนี้ฉันอยากจะเพิกเฉย
มีคำถามที่คล้ายกันฉันจะรวมห้องสมุด PHP ได้อย่างไร แต่ฉันไม่คิดว่าสิ่งนี้จะตอบปัญหาของฉันได้
คำตอบสำหรับคำถามนี้โดยพื้นฐานแล้วบอกว่าจะใช้Libraries APIแต่ทุกโมดูลเดียวที่ฉันพบว่าใช้สิ่งนี้เพียงทำlibraries_get_path()
เพื่อรับ basepath (และรวมถึงเส้นทางทางเลือกเมื่อไม่พร้อมใช้งาน) จากนั้นทำอย่างใดอย่างหนึ่งrequire
หรือinclude
กับบางส่วน การตรวจสอบข้อผิดพลาด (หรือไม่) ทุกคนทำสิ่งที่ชอบ:
if (!class_exists('Foo')) {
$path = function_exists('libraries_get_path') ?
libraries_get_path('foo') : 'sites/all/libraries/foo';
if (!include($path . '/Foo.php')) {
// handle this error
}
}
ในกรณีนี้ Libraries API ไม่ได้ทำอะไรจริงๆ ฉันไม่เห็นข้อได้เปรียบในการใช้สิ่งนี้มากกว่าวิธีเก่า ๆ ที่ขอให้ผู้ใช้ดาวน์โหลดสำเนาและวางไว้ในโฟลเดอร์โมดูลเอง และยังคงมีปัญหาที่นักพัฒนาโมดูลยังคงต้องการที่จะตนเองทำโหลดด้วย/include
require
ตัวอย่างเช่นโมดูล Facebook เพิ่งโหลดไลบรารีในhook_init
และโมดูลตัวกรอง HTML มีฟังก์ชันภายในเพื่อตรวจสอบและโหลดทุกครั้งที่ต้องการไลบรารี
นี่อาจเป็นการฝึกฝนที่แพร่หลายแต่ก็ไม่ได้เป็นแนวปฏิบัติที่ดีที่สุด
โมดูลของฉันควรใช้ความคิดริเริ่มและประกาศสิ่งที่hook_libraries_info
ฉันสามารถใช้ได้libraries_load('foo')
หรือไม่? นี่ก็เหมือนกัน
if (libraries_load($name)) {..}
คือเพื่อหลีกเลี่ยง WSOD ในกรณีที่ไม่มีไลบรารี