Pourquoi le nom du dossier est-il en c
minuscules controllers
? Alors que Model, Block et Helper commencent par une lettre majuscule?
controllers
Muthu
la source
la source
Réponses:
Les classes situées dans les
controllers
dossiers sont une race spéciale de classes.Vous ne pouvez pas les réécrire de la même manière que vous réécrivez un modèle ou un bloc à l'aide de la
<rewrite>
baliseconfig.xml
, vous ne pouvez pas les instancier à l'aide d'une fabrique comme vous le faites pour les modèles (Mage::getModel()
) ou avec des assistants (Mage::helper
) ou avec des blocs (Mage::app()->getLayout()->createBlock()
).Je veux dire qu'il y en a
Mage::getControllerInstance()
mais c'est un peu différent. Plus d'informations à ce sujet plus tard.Vous remarquerez peut-être qu'ils ne suivent pas réellement la règle de dénomination comme les autres classes.
L'œuvre
controllers
est introuvable dans le nom de la classe.Prenons par exemple le contrôleur trouvé dans
Mage/Catalog/controllers/CategoryController.php
.Le nom de la classe est
Mage_Catalog_CategoryController
.Je ne peux pas vous donner une réponse sûre à 100%, seul un développeur principal peut le faire.
Mais mon hypothèse est que quelqu'un ne voulait pas que les contrôleurs soient chargés automatiquement.
Jetez un œil à cette méthode
Mage_Core_Controller_Varien_Router_Standard::match
. C'est gros et effrayant, mais c'est celui qui mappe une URL à un contrôleur et une action.Il y a beaucoup de calculs effectués mais quelque part il y a cette ligne:
Si nous creusons plus profondément dans le
_validateControllerClassName
vous finirez pargetControllerFileName
ressembler à ceci:et
_includeControllerClass
qui fait essentiellement ceci:include $controllerFileName;
.Notez le codé
controllers
en dur dans la méthodegetControllerFileName
et notez que le fichier du contrôleur est juste inclus. Donc pas de chargement automatique.Enfin, la fabrique de contrôleurs
Mage::getControllerInstance()
ne trouve pas la classe et ne regarde pas dans les réécritures. Il fait justereturn new $class($request, $response, $invokeArgs);
où se$class
trouve la classe de contrôleur.Note latérale : Dans certains modules, il existe un dossier appelé
Controller
(avec C majuscule) et les classes suivent le nom de classe standard. Ces classes ne sont pas vraiment des contrôleurs. Ils sont utilisés comme classes parentes pour d'autres contrôleurs du module ou comme routeurs.Note latérale 2 : Cela n'existe pas dans Magento 2. Tous les contrôleurs se trouvent dans le
Controller
dossier.la source
Marius tu es si grand: D
Ma réponse aurait simplement été:
Il s'agit de la norme Zend Framework: http://framework.zend.com/manual/1.12/en/zend.controller.quickstart.html
la source
controllers
et je suppose que l'équipe principale de Mage serait un expert du framework zend. Gloire. Merci d'avoir partagé ce lien