Warum steht der c
Ordnername in Kleinbuchstaben controllers
? Während Model, Block und Helper mit einem Großbuchstaben beginnen?
Warum steht der c
Ordnername in Kleinbuchstaben controllers
? Während Model, Block und Helper mit einem Großbuchstaben beginnen?
Antworten:
Die in den controllers
Ordnern 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.xml
Sie 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 controllers
ist 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 _validateControllerClassName
Sie am Ende so getControllerFileName
aus:
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 _includeControllerClass
dass im Grunde tut dies: include $controllerFileName;
.
Beachten Sie die controllers
in der Methode fest codierte getControllerFileName
und 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 $class
die 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 Controller
Ordner.
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
controllers
und ich nehme an, dass das Mage Kernteam ein Zend Framework Experte wäre. Ein dickes Lob. Vielen Dank für den Link