การวิเคราะห์ปัญหา
ปัญหาในการติดตั้งการอ้างอิงโดยไม่มี Composerคือระบบโหลดอัตโนมัติ
นักแต่งเพลงที่ใช้โหลดโฮมเมดขึ้นอยู่กับแผนที่อาร์เรย์นี้เป็นมาตรฐานโดยพฤตินัย แต่ระบบโหลดอัตโนมัตินี้ "โดยบังเอิญ" ในกรณีนี้ไม่สอดคล้องกับ PSR-4
PSR-4 เป็นมาตรฐานde-iureสำหรับการโหลดอัตโนมัติในคลาส PHP ดังนั้นคุณจึงไม่สามารถหลีกหนีจากการโหลดอัตโนมัติได้ คุณต้องใช้หนึ่งในนั้น
ข้อเสนอโซลูชัน
ในกรณีนี้ตัวโหลดอัตโนมัติ PSR-4 ที่ยอดเยี่ยมนี้สามารถกำหนดค่าด้วยตนเองเพื่อโหลดอัตโนมัติVendorClass
ในVendorNamespace
ที่ใดก็ได้ในโค้ดของคุณตราบเท่าที่คุณต้องการautoload.php
ไฟล์ที่กำหนดเองในช่วงต้นของซอร์สโค้ดของคุณ
ตัวอย่างชีวิตจริง
ลองดูตัวอย่างนี้: ฉันมีโครงการเดิมที่ทำไม่ได้และจะไม่ใช้ Composer ไม่เคยและไม่เคยแม้ว่าพระเจ้าจะอนุญาตด้วยปาฏิหาริย์ โครงการนี้จะมีความเร็วในการพัฒนาที่ยอดเยี่ยมนี้กับแพคเกจสำหรับสคริปต์บรรทัดคำสั่ง นี่คือโครงสร้างไดเรกทอรีโครงการของฉัน:
- src
- tests
- vendor (not the Composer's one)
แพ็คเกจนี้มีโครงสร้างไดเร็กทอรีนี้:
- examples
- src
- Commando
- tests
สิ่งเดียวที่ฉันต้องการคือsrc
โฟลเดอร์ การวางโฟลเดอร์นี้ในโฟลเดอร์ผู้ขายของฉันก็ใช้ได้ ดังนั้นตัวโหลดอัตโนมัติที่กำหนดเองของฉันจะเป็นดังนี้:
$base_path = "path\to\my\project";
$autoloader_class = '\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
define("BASE_PATH", str_replace("\\", DIRECTORY_SEPARATOR, $base_path));
require_once BASE_PATH.'\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
$package = [
"nategood\commando" => [
"namespace" => "Commando",
"path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\nategood\commando\src\Commando')
],
"kevinlebrun\colors.php" => [
"namespace" => "Colors",
"path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\kevinlebrun\colors.php\src\Colors')
]
];
$loader = new \PSR4\Psr4AutoloaderClass;
$loader->register();
$loader->addNamespace($package["nategood\commando"]["namespace"], BASE_PATH.$package["nategood\commando"]["path"]);
$loader->addNamespace($package["nategood\commando"]["namespace"], BASE_PATH.$package["nategood\commando"]["path"]."\Util");
$loader->addNamespace($package["kevinlebrun\colors.php"]["namespace"], BASE_PATH.$package["kevinlebrun\colors.php"]["path"]);
ตอนนี้ฉันสามารถใช้แพ็คเกจคำสั่งได้ทุกที่ในโปรเจ็กต์ของฉัน!
ข้อเสียข้อดี
โซลูชันนี้ช่วยให้คุณ:
- สร้างตัวโหลดอัตโนมัติแบบกำหนดเองได้อย่างง่ายดายและด้วยตนเอง (คุณจะต้องระบุ
VendorNamespace
และโฟลเดอร์ที่ค้นหาVendorClass
es ในไฟล์VendorNamespace
.
- จัดระเบียบการพึ่งพาผู้แต่งของคุณได้อย่างอิสระทุกที่ในโฟลเดอร์โครงการของคุณ (และทำไมไม่อยู่นอกมัน)
- นำเข้าแพ็กเกจ Composer ตามที่อยู่ในโปรเจ็กต์ของคุณ (ไม่ว่าจะดาวน์โหลดในเครื่องด้วย Composer หรือโคลนที่เก็บแพ็กเกจ) หรือส่วนที่เกี่ยวข้อง (เช่นการลบไฟล์ composer.json หรือไฟล์ที่ต้องใช้ตัวโหลดอัตโนมัติของผู้แต่ง)
จุดด้อย:
- สร้างตัวโหลดอัตโนมัติที่กำหนดเองด้วยตนเองหมายถึงการทำงานกับทุกๆพึ่งพาที่จำเป็นของโครงการของคุณ (ฉันหวังว่าจะไม่มาก)
- ข้อผิดพลาดในเส้นทางต้นทางของแพ็กเกจอาจเป็นเรื่องที่น่าเบื่อและน่าหงุดหงิด
- ใช้งานได้กับชื่อไฟล์ที่รองรับ PSR-4 เท่านั้น (เช่นใช้
A.class.php
ชื่อไฟล์ไม่ได้)
include
ไฟล์เหล่านี้ไปที่ไหนสักแห่ง