Perché il nome della cartella è cminuscolo controllers? Mentre Model, Block e Helper iniziano con una lettera maiuscola?
Perché il nome della cartella è cminuscolo controllers? Mentre Model, Block e Helper iniziano con una lettera maiuscola?
Risposte:
Le classi che si trovano nelle controllerscartelle 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 controllersnon 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 _validateControllerClassNamein getControllerFileNamequesto 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 _includeControllerClassche, in fondo fa questo: include $controllerFileName;.
Notare il codice hard controllersnel metodo getControllerFileNamee 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'è $classla 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 Controllercartella.
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
controllerse suppongo che il core team di Mage sarebbe un esperto del framework zend. Complimenti. Grazie per aver condiviso quel link