ทำไมc
ตัวพิมพ์เล็กในcontrollers
ชื่อโฟลเดอร์คืออะไร ในกรณีที่แบบจำลองบล็อกและผู้ช่วยเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่?
ทำไมc
ตัวพิมพ์เล็กในcontrollers
ชื่อโฟลเดอร์คืออะไร ในกรณีที่แบบจำลองบล็อกและผู้ช่วยเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่?
คำตอบ:
คลาสที่อยู่ในcontrollers
โฟลเดอร์เป็นสายพันธุ์พิเศษ
คุณไม่สามารถเขียนซ้ำได้ในลักษณะเดียวกับที่คุณเขียนโมเดลหรือบล็อกโดยใช้<rewrite>
แท็กconfig.xml
คุณไม่สามารถสร้างอินสแตนซ์เหล่านั้นโดยใช้โรงงานเช่นเดียวกับรุ่น ( Mage::getModel()
) หรือกับผู้ช่วยเหลือ ( Mage::helper
) หรือบล็อก ( Mage::app()->getLayout()->createBlock()
)
ฉันหมายความว่ามีMage::getControllerInstance()
แต่นั่นแตกต่างกันเล็กน้อย เพิ่มเติมเกี่ยวกับเรื่องนี้ในภายหลัง
คุณอาจสังเกตเห็นว่าพวกเขาไม่ปฏิบัติตามกฎการตั้งชื่อเหมือนกับคลาสอื่น ๆ
การทำงานcontrollers
จะไม่พบในชื่อชั้น เอาเถอะตัวอย่างเช่นตัวควบคุมที่พบใน
ชื่อชั้น
ฉันไม่สามารถให้คำตอบที่แน่นอนแก่คุณได้ 100% มี แต่นักพัฒนาหลักเท่านั้นที่ทำได้Mage/Catalog/controllers/CategoryController.php
Mage_Catalog_CategoryController
แต่ข้อสันนิษฐานของฉันคือมีบางคนไม่ต้องการให้ตัวควบคุมถูกโหลดอัตโนมัติ
ลองดูวิธีMage_Core_Controller_Varien_Router_Standard::match
นี้ มันใหญ่และน่ากลัว แต่นั่นคือแผนที่ที่เชื่อมโยง URL ไปยังคอนโทรลเลอร์และแอ็คชั่น
มีการคำนวณจำนวนมาก แต่มีบางแห่งที่มีบรรทัดนี้:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
หากเราขุดลึกลงไปในตัว_validateControllerClassName
คุณคุณจะพบgetControllerFileName
ว่าสิ่งนี้:
public function getControllerFileName($realModule, $controller)
{
$parts = explode('_', $realModule);
$realModule = implode('_', array_splice($parts, 0, 2));
$file = Mage::getModuleDir('controllers', $realModule);
if (count($parts)) {
$file .= DS . implode(DS, $parts);
}
$file .= DS.uc_words($controller, DS).'Controller.php';
return $file;
}
และในการที่พื้นไม่นี้: _includeControllerClass
include $controllerFileName;
สังเกตว่าฮาร์ดโค้ดcontrollers
ในวิธีการgetControllerFileName
และแจ้งให้ทราบว่าไฟล์คอนโทรลเลอร์ถูกรวมไว้ ดังนั้นไม่มีการโหลดอัตโนมัติ
ในที่สุดโรงงานควบคุมMage::getControllerInstance()
ไม่ได้ค้นหาระดับและไม่ได้ดูในการเขียนใหม่ มันเพียงแค่ทำในระดับreturn new $class($request, $response, $invokeArgs);
ที่$class
เป็นตัวควบคุม
หมายเหตุด้านข้าง : ในบางโมดูลจะมีโฟลเดอร์ชื่อController
(ที่มีตัวพิมพ์ใหญ่ C) และคลาสที่ตามด้วยการตั้งชื่อคลาสมาตรฐาน คลาสเหล่านั้นไม่ใช่ตัวควบคุมจริง ๆ พวกเขาจะใช้เป็นคลาสผู้ปกครองสำหรับตัวควบคุมอื่น ๆ ในโมดูลหรือเป็นเราเตอร์
หมายเหตุด้านข้าง 2 : สิ่งนี้ไม่มีอยู่ใน Magento 2 ตัวควบคุมทั้งหมดอยู่ในController
โฟลเดอร์
Marius คุณยอดเยี่ยมมาก: D
คำตอบของฉันจะเป็น:
นี่คือมาตรฐานของ Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
controllers
และฉันคิดว่าทีมหลักของ Mage จะเป็นผู้เชี่ยวชาญด้านกรอบของ zend ความรุ่งโรจน์ ขอขอบคุณที่แบ่งปันลิงก์นี้