Nombres completos de clases en los métodos de fábrica de Magento

11

En Magento 1, si uso el nombre completo de la clase Magento en un método de fábrica, puedo crear una instancia de un objeto

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

Sin embargo, lo mismo no funcionará para los ayudantes. Si intentas

Mage::helper('Mage_Core_Helper_Url');

Usted obtiene

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 esta pasando?

Alan Storm
fuente
2
Recibiste esto de Twitter, ¿no? :)
Marius
1
@ Mario, me ganaste. Twitter-preguntas-como-un-servicio
philwinkle
@Marius Sí, en lugar de tratar de alentar las preguntas que recibo en Twitter.
Alan Storm

Respuestas:

8

Desde una perspectiva puramente codificante, si observa el getModelClassNamemétodo (algunas llamadas desde la pila Mage::getModel)

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

verá que si Magento no ve un /alias de clase, se supone que es un nombre de clase completo. Sin embargo, si la getHelperClassNamefunción

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

Si Magento no ve un /alias de clase, se supone que está utilizando la forma abreviada de

Mage::helper('catalog')

y agrega un dataal final del alias para que la clase se resuelva correctamente ( catalog/dataa Mage_Catalog_Model_Data).

Esto habilita los ayudantes de forma corta, pero hace que sea imposible para Magento distinguir entre un alias de ayuda de forma corta y un nombre de clase de forma larga.

El "por qué" definitivo de esto es probablemente difícil de precisar: que la creación de instancias de nombre de clase completo funcione así puede ser solo un efecto secundario de las prácticas de codificación protectora de un desarrollador que eran incompatibles con el deseo de otro desarrollador de que cada módulo tenga una clase auxiliar "principal". También podría ser un único desarrollador con exceso de trabajo que tome decisiones rápidas sobre la marcha. Probablemente haya una lección sobre gestión de proyectos y desarrollo de sistemas en algún lugar.

Alan Storm
fuente