Pourquoi le nom du dossier est-il en c
minuscules controllers
? Alors que Model, Block et Helper commencent par une lettre majuscule?
Pourquoi le nom du dossier est-il en c
minuscules controllers
? Alors que Model, Block et Helper commencent par une lettre majuscule?
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>
balise config.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:
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);
Si nous creusons plus profondément dans le _validateControllerClassName
vous finirez par getControllerFileName
ressembler à ceci:
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;
}
et _includeControllerClass
qui fait essentiellement ceci: include $controllerFileName;
.
Notez le codé controllers
en dur dans la méthode getControllerFileName
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 juste return 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.
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
controllers
et je suppose que l'équipe principale de Mage serait un expert du framework zend. Gloire. Merci d'avoir partagé ce lien