क्यों Magento के नियंत्रकों में सी है?


28

फ़ोल्डर नाम cमें लोअरकेस क्यों है controllers? जबकि मॉडल, ब्लॉक और हेल्पर एक बड़े अक्षर के साथ शुरू हो रहे हैं?


6
अरे ... नीचे क्यों? यह एक कानूनी और वास्तव में अच्छा सवाल है।
— मारियस

कोई सदस्य है (मैं पाठ्यक्रम का नाम नहीं बताऊंगा) जो अनियमित रूप से ध्वजांकित / डाउनवोट कर रहा है। उदाहरण के लिए इस प्रश्न को अपमानजनक के रूप में चिह्नित किया गया था: D
— user487772

@TimBezhashvyly ... हाँ, मैं समझता हूँ कि। यह शुरू में मेरे लिए आक्रामक था, लेकिन फिर मैंने सवाल फिर से पढ़ा :)
— Marius

एक पूंजी C के साथ नियंत्रक को पहले ही haha ​​लिया गया था।
— जूलियन लाछल ६'१४

जवाबों:


28

controllersफ़ोल्डर्स में स्थित कक्षाएं कक्षाओं की एक विशेष नस्ल हैं।
आप उन्हें उसी तरह से फिर से नहीं लिख सकते जब आप किसी मॉडल या <rewrite>टैग का उपयोग करके ब्लॉक को फिर से लिखते हैं config.xml, आप मॉडल ( Mage::getModel()) या सहायक ( Mage::helperया ब्लॉक) ( ) के साथ की तरह एक कारखाने का उपयोग करके उन्हें तुरंत नहीं कर सकते Mage::app()->getLayout()->createBlock()।
मेरा मतलब है Mage::getControllerInstance()कि लेकिन यह थोड़ा अलग है। इस पर और बाद में।
आप देख सकते हैं कि वे वास्तव में अन्य वर्गों के रूप में नामकरण नियम का पालन नहीं करते हैं। वर्ग नाम में
काम controllersनहीं मिला है।
चलो उदाहरण के लिए नियंत्रक मिला Mage/Catalog/controllers/CategoryController.php।
वर्ग का नाम है Mage_Catalog_CategoryController।
मैं आपको 100% निश्चित उत्तर नहीं दे सकता, केवल एक कोर देव ही ऐसा कर सकता है।
लेकिन मेरी धारणा यह है कि कोई नहीं चाहता था कि नियंत्रकों को ऑटोलॉज किया जाए।

इस विधि पर एक नज़र डालें Mage_Core_Controller_Varien_Router_Standard::match। यह बड़ा और डरावना है, लेकिन यह वह है जो एक यूआरएल को एक नियंत्रक और एक कार्रवाई में मैप करता है।
बहुत सारी गणनाएं की गई हैं लेकिन कहीं न कहीं यह रेखा है:

$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(कैपिटल सी के साथ) और मानक कक्षा के नामकरण का पालन करने के लिए कक्षाएं होती हैं। वे वर्ग वास्तव में नियंत्रक नहीं हैं। वे मॉड्यूल में या नियंत्रकों के रूप में अन्य नियंत्रकों के लिए मूल वर्गों के रूप में उपयोग किए जाते हैं।

साइड नोट 2 : यह Magento 2 में मौजूद नहीं है। सभी नियंत्रक Controllerफ़ोल्डर में स्थित हैं ।


15

मारियस आप इतने महान हैं: डी

मेरा जवाब बस होगा:

यह Zend फ्रेमवर्क मानक है: http://framework.zend.com/manual/1.12/en/zend.controller.quickartart.html


1
यह वास्तव में एक अच्छा जवाब है।
— मारियस

1
यह एक सुंदर उत्तर है। मुझे लगता है कि यह मारियस की तुलना में अधिक सही उत्तर होगा। क्योंकि एक zend फ्रेमवर्क डेवलपर के अलावा किसी अन्य निर्देशिका के बारे में नहीं सोचता controllersऔर मुझे लगता है कि Mage कोर टीम एक zend फ्रेमवर्क विशेषज्ञ होगी। कुडोस। उस लिंक को साझा करने के लिए धन्यवाद
— राजीव के टॉमी

बहुत मदद fulll
— अमित बेरा

1
हां मुझे लगता है कि यह सही उत्तर है। मैं ZF मानकों को देखने के लिए भी परेशान नहीं था। मैंने सिर्फ एक तार्किक व्याख्या खोजने की कोशिश की। अपने बचाव में, मैंने जवाब में कहा कि यह मेरी राय थी।
— मारियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.