Warum steht der cOrdnername in Kleinbuchstaben controllers? Während Model, Block und Helper mit einem Großbuchstaben beginnen?
Warum steht der cOrdnername in Kleinbuchstaben controllers? Während Model, Block und Helper mit einem Großbuchstaben beginnen?
Antworten:
Die in den controllersOrdnern befindlichen Klassen sind eine besondere Klasse.
Sie können sie nicht so umschreiben, wie Sie ein Modell oder einen Block mit dem <rewrite>Tag in neu schreiben. config.xmlSie können sie nicht mit einer Factory instanziieren, wie Sie es für Modelle ( Mage::getModel()) oder mit Helfern ( Mage::helper) oder mit Blöcken ( Mage::app()->getLayout()->createBlock()) tun .
Ich meine es gibt, Mage::getControllerInstance()aber das ist ein bisschen anders. Dazu später mehr.
Möglicherweise stellen Sie fest, dass sie nicht der Namensregel der anderen Klassen entsprechen.
Die Arbeit controllersist nicht im Klassennamen enthalten.
Nehmen wir zum Beispiel den Controller aus Mage/Catalog/controllers/CategoryController.php.
Der Klassenname ist Mage_Catalog_CategoryController.
Ich kann Ihnen keine 100% sichere Antwort geben, das kann nur ein Core-Entwickler.
Aber ich gehe davon aus, dass jemand nicht wollte, dass die Controller automatisch geladen werden.
Schauen Sie sich diese Methode an Mage_Core_Controller_Varien_Router_Standard::match. Es ist groß und beängstigend, aber es ist dasjenige, das eine URL einem Controller und einer Aktion zuordnet.
Es werden viele Berechnungen durchgeführt, aber irgendwo gibt es diese Zeile:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Wenn wir tiefer in das graben, sehen _validateControllerClassNameSie am Ende so getControllerFileNameaus:
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;
}
und _includeControllerClassdass im Grunde tut dies: include $controllerFileName;.
Beachten Sie die controllersin der Methode fest codierte getControllerFileNameund beachten Sie, dass die Controller-Datei nur enthalten ist. Also kein Autoloading.
Schließlich findet die Controller-Factory Mage::getControllerInstance()die Klasse nicht und sucht nicht in den Neuschreibungen. Es macht nur, return new $class($request, $response, $invokeArgs);wo $classdie Controller-Klasse ist.
Randnotiz : In einigen Modulen gibt es einen Ordner mit dem Namen Controller(mit Großbuchstaben C) und die Klassen folgen der Standardklassennennung. Diese Klassen sind nicht wirklich Controller. Sie werden als übergeordnete Klassen für andere Controller im Modul oder als Router verwendet.
Nebenbemerkung 2 : Dies ist in Magento 2 nicht vorhanden. Alle Controller befinden sich im ControllerOrdner.
Marius du bist so toll: D
Meine Antwort wäre nur gewesen:
Dies ist der Zend Framework Standard: http://framework.zend.com/manual/1.12/de/zend.controller.quickstart.html
controllersund ich nehme an, dass das Mage Kernteam ein Zend Framework Experte wäre. Ein dickes Lob. Vielen Dank für den Link