Perché il nome della cartella è c
minuscolo controllers
? Mentre Model, Block e Helper iniziano con una lettera maiuscola?
Perché il nome della cartella è c
minuscolo controllers
? Mentre Model, Block e Helper iniziano con una lettera maiuscola?
Risposte:
Le classi che si trovano nelle controllers
cartelle sono una speciale classe di classi.
Non puoi riscriverli nello stesso modo in cui riscrivi un modello o un blocco usando il <rewrite>
tag in config.xml
, non puoi istanziarli usando una fabbrica come fai per i modelli ( Mage::getModel()
) o con gli helper ( Mage::helper
) o con i blocchi ( Mage::app()->getLayout()->createBlock()
).
Voglio dire che c'è Mage::getControllerInstance()
ma è un po 'diverso. Più su questo più tardi.
Potresti notare che in realtà non seguono la regola di denominazione come le altre classi.
L'opera controllers
non si trova nel nome della classe.
Prendiamo ad esempio il controller trovato in Mage/Catalog/controllers/CategoryController.php
.
Il nome della classe è Mage_Catalog_CategoryController
.
Non posso darti una risposta certa al 100%, solo un core sviluppatore può farlo.
Ma la mia ipotesi è che qualcuno non voleva che i controller fossero caricati automaticamente.
Dai un'occhiata a questo metodo Mage_Core_Controller_Varien_Router_Standard::match
. È grande e spaventoso, ma è quello che associa un url a un controller e un'azione.
Ci sono molti calcoli fatti ma da qualche parte c'è questa linea:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Se scaviamo più a fondo, finirai _validateControllerClassName
in getControllerFileName
questo aspetto:
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;
}
e _includeControllerClass
che, in fondo fa questo: include $controllerFileName;
.
Notare il codice hard controllers
nel metodo getControllerFileName
e notare che il file del controller è appena incluso. Quindi nessun caricamento automatico.
Infine, il controller factory Mage::getControllerInstance()
non trova la classe e non guarda nelle riscritture. Fa solo return new $class($request, $response, $invokeArgs);
dov'è $class
la classe del controller.
Nota a margine : in alcuni moduli è presente una cartella denominata Controller
(con maiuscola C) e le classi in seguono la denominazione di classe standard. Quelle classi non sono realmente controller. Sono utilizzati come classi principali per altri controller nel modulo o come router.
Nota a margine 2 : questo non esiste in Magento 2. Tutti i controller si trovano nella Controller
cartella.
Marius sei così grande: D
La mia risposta sarebbe stata:
Questo è lo standard Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
controllers
e suppongo che il core team di Mage sarebbe un esperto del framework zend. Complimenti. Grazie per aver condiviso quel link