Noms de classe complets dans les méthodes d'usine de Magento


11

Dans Magento 1, si j'utilise le nom complet de la classe Magento dans une méthode d'usine, je peux instancier un objet

//trying full class name instead of catalog/product
$object = Mage::getModel('Mage_Catalog_Model_Product');

Cependant, la même chose ne fonctionnera pas pour les assistants. Si tu essayes

Mage::helper('Mage_Core_Helper_Url');

Vous recevez

Warning: include(Mage/Mage/Core/Helper/Url/Helper/Data.php): failed to open stream: No such file or directory  in /path/to/magentolib/Varien/Autoload.php on line 93

#0 /path/to/magentolib/Varien/Autoload.php(93): mageCoreErrorHandler(2, 'include(Mage/Ma...', '/path/to/magent...', 93, Array)
#1 /path/to/magentolib/Varien/Autoload.php(93): Varien_Autoload::autoload()
#2 [internal function]: Varien_Autoload->autoload('Mage_Mage_Core_...')
#3 /path/to/magentoapp/Mage.php(547): spl_autoload_call('Mage_Mage_Core_...')
#4 /path/to/magentoapp/code/local/Sebastianjuffar/Commercebug/controllers/IndexController.php(11): Mage::helper('Mage_Core_Helpe...')
#5 /path/to/magentoapp/code/core/Mage/Core/Controller/Varien/Action.php(418): Sebastianjuffar_Commercebug_IndexController->indexAction()
#6 /path/to/magentoapp/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#7 /path/to/magentoapp/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#8 /path/to/magentoapp/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#9 /path/to/magentoapp/Mage.php(684): Mage_Core_Model_App->run(Array)
#10 /path/to/magentoindex.php(87): Mage::run('', 'store')
#11 {main}

Que se passe-t-il?


2
Vous avez obtenu cela de Twitter, n'est-ce pas? :)
Marius

1
@marius tu m'as battu. Twitter-questions-as-a-service.
philwinkle

@Marius Ouais - essayant d'encourager les questions que j'ai sur Twitter à venir ici à la place.
Alan Storm

Réponses:


8

D'un point de vue purement codé, si vous jetez un oeil à la getModelClassNameméthode (quelques appels vers le bas de la pile Mage::getModel)

public function getModelClassName($modelClass)
{
    $modelClass = trim($modelClass);
    if (strpos($modelClass, '/')===false) {
        return $modelClass;
    }
    return $this->getGroupedClassName('model', $modelClass);
}

vous verrez que si Magento ne voit pas de /dans l'alias de classe, il suppose que c'est un nom complet de classe. Cependant, si la getHelperClassNamefonction

public function getHelperClassName($helperName)
{
    if (strpos($helperName, '/') === false) {
        $helperName .= '/data';
    }
    return $this->getGroupedClassName('helper', $helperName);
}

Si Magento ne voit pas d' /alias dans la classe, il suppose que vous utilisez la forme abrégée de

Mage::helper('catalog')

et ajoute un dataà la fin de l'alias pour que la classe se résolve correctement ( catalog/dataà Mage_Catalog_Model_Data).

Cela permet aux assistants de formulaire court, mais rend impossible pour Magento de faire la différence entre un alias d'assistance de formulaire court et un nom de classe de formulaire long.

Le «pourquoi» ultime de ceci est probablement difficile à cerner - que l'instanciation du nom de classe complet fonctionne comme ça du tout peut juste être un effet secondaire des pratiques de codage de protection d'un développeur qui étaient incompatibles avec le désir d'un autre développeur que chaque module ait une classe auxiliaire "principale". Il peut également s'agir d'un seul développeur surchargé de travail qui prend des décisions rapides au fur et à mesure. Il y a probablement une leçon de gestion de projet et de développement de systèmes quelque part.

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.