Nomi di classe completi nei metodi di fabbrica di Magento


11

In Magento 1, se utilizzo il nome completo della classe Magento in un metodo factory, sono in grado di creare un'istanza di un oggetto

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

Tuttavia, la stessa cosa non funzionerà per gli helper. Se provi

Mage::helper('Mage_Core_Helper_Url');

Hai capito

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}

Cosa sta succedendo?


2
Hai capito da Twitter, vero? :)
Marius

1
@marius mi hai battuto. Twitter-domanda-as-a-service.
Filwinkle,

@Marius Sì - cercando di incoraggiare le domande che ricevo su Twitter a venire qui.
Alan Storm,

Risposte:


8

Da una prospettiva puramente codificante, se dai un'occhiata al getModelClassNamemetodo (alcune chiamate dallo stack da Mage::getModel)

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

vedrai che se Magento non vede un /alias nella classe, assume che sia un nome completo della classe. Tuttavia, se la getHelperClassNamefunzione

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

Se Magento non vede un /alias nella classe, presume che tu stia usando la forma abbreviata di

Mage::helper('catalog')

e aggiunge dataa alla fine dell'alias in modo che la classe si risolva correttamente ( catalog/dataa Mage_Catalog_Model_Data).

Ciò consente agli helper di forma breve, ma rende impossibile per Magento distinguere tra un alias helper di forma breve e un nome di classe di forma lunga.

L'ultimo "perché" di questo è probabilmente difficile da stabilire - che l'istanziazione di un nome di classe completo funziona in quel modo potrebbe essere solo un effetto collaterale delle pratiche di codifica protettiva di uno sviluppatore che erano incompatibili con il desiderio di un altro sviluppatore di avere ogni modulo una classe di supporto "principale". Potrebbe anche essere un singolo sviluppatore oberato di lavoro che prende decisioni rapide mentre procedono. C'è probabilmente lezione nella gestione dei progetti e nello sviluppo di sistemi da qualche parte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.