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?
Réponses:
D'un point de vue purement codé, si vous jetez un oeil à la
getModelClassName
méthode (quelques appels vers le bas de la pileMage::getModel
)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 lagetHelperClassName
fonctionSi Magento ne voit pas d'
/
alias dans la classe, il suppose que vous utilisez la forme abrégée deet 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.
la source