Dlaczego c jest małymi literami w kontrolerach Magento?

28

Dlaczego nazwa folderu ma cmałe litery controllers? Podczas gdy Model, Blok i Pomocnik zaczynają się od dużej litery?

Muthu
źródło
6
Hej ... dlaczego głosowanie negatywne? To uzasadnione i właściwie dobre pytanie.
Marius
Jest członek (oczywiście nie podam nazwy), który losowo zgłasza / oddaje głos. Na przykład to pytanie zostało oznaczone jako obraźliwe: D
user487772,
@TimBezhashvyly ... tak, rozumiem to. Na początku wydawało mi się to obraźliwe, ale potem ponownie przeczytałem pytanie :)
Marius
Kontroler z dużą literą C został już zajęty haha.
Julien Lachal

Odpowiedzi:

28

Klasy znajdujące się w controllersfolderach są specjalnym rodzajem klas.
Nie można ich przepisać w taki sam sposób, jak przepisuje się model lub blok przy użyciu <rewrite>znacznika config.xml, nie można utworzyć ich przy użyciu fabryki, jak w przypadku modeli ( Mage::getModel()), pomocników ( Mage::helper) lub bloków ( Mage::app()->getLayout()->createBlock()).
Mam na myśli, że jest, Mage::getControllerInstance()ale to trochę inaczej. Więcej na ten temat później.
Możesz zauważyć, że tak naprawdę nie przestrzegają reguły nazewnictwa jak inne klasy.
Dzieła controllersnie znaleziono w nazwie klasy.
Weźmy na przykład kontroler znaleziony w Mage/Catalog/controllers/CategoryController.php.
Nazwa klasy to Mage_Catalog_CategoryController.
Nie mogę dać ci 100% pewnej odpowiedzi, tylko główny programista może to zrobić.
Ale zakładam, że ktoś nie chciał, aby kontrolery były ładowane automatycznie.

Spójrz na tę metodę Mage_Core_Controller_Varien_Router_Standard::match. Jest duży i przerażający, ale to ten mapuje adres URL do kontrolera i akcji.
Wykonano wiele obliczeń, ale gdzieś jest ta linia:

$controllerClassName = $this->_validateControllerClassName($realModule, $controller);

Jeśli kopiemy głębiej _validateControllerClassName, skończysz w getControllerFileNametaki sposób:

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;
}

i _includeControllerClassże w zasadzie robi to: include $controllerFileName;.

Zwróć uwagę na kodowanie controllersna stałe w metodzie getControllerFileNamei zauważ, że plik kontrolera jest właśnie dołączony. Więc nie ma automatycznego ładowania.

Wreszcie, fabryka kontrolerów Mage::getControllerInstance()nie lokalizuje klasy i nie sprawdza zapisów. Po prostu robi, return new $class($request, $response, $invokeArgs);gdzie $classjest klasa kontrolera.

Uwaga dodatkowa : w niektórych modułach znajduje się folder o nazwie Controller(z dużą literą C), a klasy są zgodne ze standardową nazwą klasy. Te klasy nie są tak naprawdę kontrolerami. Są one używane jako klasy nadrzędne dla innych kontrolerów w module lub jako routery.

Uwaga dodatkowa 2 : To nie istnieje w Magento 2. Wszystkie kontrolery znajdują się w Controllerfolderze.

Marius
źródło
15

Marius, jesteś taki świetny: D

Moja odpowiedź brzmiałaby:

Jest to standard Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html

Fabian Blechschmidt
źródło
1
To właściwie dobra odpowiedź.
Marius
1
to jest piękna odpowiedź. Myślę, że to byłaby bardziej poprawna odpowiedź niż Marius. Ponieważ deweloper Zend Framework nie pomyślałby o innym katalogu innym niż controllersi zakładam, że główny zespół Mage byłby ekspertami od zend framework. Sława. Dzięki za udostępnienie tego linku
Rajeev K Tomy
Bardzo pomoc w całości
Amit Bera
1
Tak, myślę, że to również poprawna odpowiedź. Nawet nie zadałem sobie trudu, aby spojrzeć na standardy ZF. Właśnie próbowałem znaleźć logiczne wytłumaczenie. W mojej obronie stwierdziłam w odpowiedzi, że to moja opinia.
Marius