Dlaczego nazwa folderu ma c
małe litery controllers
? Podczas gdy Model, Blok i Pomocnik zaczynają się od dużej litery?
Dlaczego nazwa folderu ma c
małe litery controllers
? Podczas gdy Model, Blok i Pomocnik zaczynają się od dużej litery?
Odpowiedzi:
Klasy znajdujące się w controllers
folderach 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 controllers
nie 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 getControllerFileName
taki 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 controllers
na stałe w metodzie getControllerFileName
i 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 $class
jest 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 Controller
folderze.
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
controllers
i zakładam, że główny zespół Mage byłby ekspertami od zend framework. Sława. Dzięki za udostępnienie tego linku