Pourquoi c est-il en minuscules dans les contrôleurs de Magento?


28

Pourquoi le nom du dossier est-il en cminuscules controllers? Alors que Model, Block et Helper commencent par une lettre majuscule?


6
Hé ... pourquoi le downvote? C'est une question légitime et en fait bonne.
Marius

Il y a un membre (je ne dirai pas le nom, bien sûr) qui signale / rétrograde au hasard. Par exemple, cette question a été signalée comme offensante: D
user487772

@TimBezhashvyly ... ouais je comprends ça. Cela m'a paru offensant au début, mais j'ai relu la question :)
Marius

Le contrôleur avec un C majuscule était déjà pris haha.
Julien Lachal

Réponses:


28

Les classes situées dans les controllersdossiers 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 controllersest 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 _validateControllerClassNamevous finirez par getControllerFileNameressembler à 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 _includeControllerClassqui fait essentiellement ceci: include $controllerFileName;.

Notez le codé controllersen dur dans la méthode getControllerFileNameet 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 $classtrouve 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 Controllerdossier.


15

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


1
C'est en fait une bonne réponse.
Marius

1
c'est une belle réponse. Je pense que ce serait une réponse plus correcte que Marius. Parce qu'un développeur de framework zend ne penserait pas à un autre répertoire que controllerset je suppose que l'équipe principale de Mage serait un expert du framework zend. Gloire. Merci d'avoir partagé ce lien
Rajeev K Tomy

Très utile
Amit Bera

1
Oui, je pense que c'est aussi la bonne réponse. Je n'ai même pas pris la peine de regarder les normes ZF. J'ai juste essayé de trouver une explication logique. Pour ma défense, j'ai déclaré dans ma réponse que c'était mon opinion.
Marius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.