ทำไม c เป็นตัวพิมพ์เล็กในตัวควบคุมของ Magento


28

ทำไมcตัวพิมพ์เล็กในcontrollersชื่อโฟลเดอร์คืออะไร ในกรณีที่แบบจำลองบล็อกและผู้ช่วยเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่?


6
เฮ้ ... ทำไมต้องโหวต นี่เป็นคำถามที่ถูกต้องและดีจริงๆ
Marius

มีสมาชิกคนหนึ่ง (ฉันจะไม่บอกชื่อของหลักสูตร) ​​ที่กำลังตั้งค่าสถานะ / downvoting แบบสุ่ม ตัวอย่างเช่นคำถามนี้ถูกตั้งค่าสถานะว่าเป็นการล่วงละเมิด: D
user487772

@ TimBezhashvyly ... ใช่ฉันเข้าใจแล้ว มัน seamed ไม่พอใจให้กับผมในช่วงเริ่มต้น แต่แล้วผมอ่านคำถามอีกครั้ง :)
Marius

ผู้ควบคุมที่มีทุน C ถูกยึดแล้วฮ่าฮ่า
Julien Lachal

คำตอบ:


28

คลาสที่อยู่ใน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;
}

และในการที่พื้นไม่นี้: _includeControllerClassinclude $controllerFileName;

สังเกตว่าฮาร์ดโค้ดcontrollersในวิธีการgetControllerFileNameและแจ้งให้ทราบว่าไฟล์คอนโทรลเลอร์ถูกรวมไว้ ดังนั้นไม่มีการโหลดอัตโนมัติ

ในที่สุดโรงงานควบคุมMage::getControllerInstance()ไม่ได้ค้นหาระดับและไม่ได้ดูในการเขียนใหม่ มันเพียงแค่ทำในระดับreturn new $class($request, $response, $invokeArgs);ที่$classเป็นตัวควบคุม

หมายเหตุด้านข้าง : ในบางโมดูลจะมีโฟลเดอร์ชื่อController(ที่มีตัวพิมพ์ใหญ่ C) และคลาสที่ตามด้วยการตั้งชื่อคลาสมาตรฐาน คลาสเหล่านั้นไม่ใช่ตัวควบคุมจริง ๆ พวกเขาจะใช้เป็นคลาสผู้ปกครองสำหรับตัวควบคุมอื่น ๆ ในโมดูลหรือเป็นเราเตอร์

หมายเหตุด้านข้าง 2 : สิ่งนี้ไม่มีอยู่ใน Magento 2 ตัวควบคุมทั้งหมดอยู่ในControllerโฟลเดอร์


15

Marius คุณยอดเยี่ยมมาก: D

คำตอบของฉันจะเป็น:

นี่คือมาตรฐานของ Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html


1
จริงๆแล้วมันเป็นคำตอบที่ดี
Marius

1
นี่คือคำตอบที่สวยงาม ฉันคิดว่านี่จะเป็นคำตอบที่ถูกต้องมากกว่า Marius เนื่องจากผู้พัฒนาเฟรมเวิร์ก zend จะไม่คิดถึงไดเรกทอรีอื่นนอกเหนือจากนี้controllersและฉันคิดว่าทีมหลักของ Mage จะเป็นผู้เชี่ยวชาญด้านกรอบของ zend ความรุ่งโรจน์ ขอขอบคุณที่แบ่งปันลิงก์นี้
Rajeev K Tomy

ช่วยได้มาก fulll
Amit Bera

1
ใช่ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องเช่นกัน ฉันไม่ได้สนใจที่จะดูมาตรฐาน ZF ฉันแค่พยายามหาคำอธิบายที่สมเหตุสมผล ในการป้องกันของฉันฉันระบุในคำตอบว่ามันเป็นความคิดเห็นของฉัน
Marius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.