Vollständige Klassennamen in Magentos Factory-Methoden

11

Wenn ich in Magento 1 den vollständigen Magento-Klassennamen in einer Factory-Methode verwende, kann ich ein Objekt instanziieren

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

Das Gleiche funktioniert jedoch nicht für Helfer. Wenn du es versuchst

Mage::helper('Mage_Core_Helper_Url');

Du erhältst

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}

Was ist los?

Alan Storm
quelle
2
Du hast das von Twitter bekommen, oder? :)
Marius
1
@Marius du hast mich geschlagen. Twitter-Fragen-als-Service.
Philwinkle
@Marius Ja - ich versuche die Fragen, die ich auf Twitter bekomme, zu ermutigen, stattdessen hierher zu kommen.
Alan Storm

Antworten:

8

Aus rein codierender Sicht, wenn Sie sich die getModelClassNameMethode ansehen (ein paar Aufrufe des Stacks von Mage::getModel)

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

Sie werden sehen, dass Magento, wenn /im Klassenalias kein Alias ​​angezeigt wird, davon ausgeht, dass es sich um einen vollständigen Klassennamen handelt. Allerdings ist die getHelperClassNameFunktion

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

Wenn Magento /im Klassenalias kein Alias sieht , wird davon ausgegangen, dass Sie die Kurzform von verwenden

Mage::helper('catalog')

und fügt dataam Ende des Alias ​​ein a hinzu, damit die Klasse ordnungsgemäß ( catalog/databis Mage_Catalog_Model_Data) aufgelöst wird.

Dies ermöglicht den Kurzform-Helfern, macht es Magento jedoch unmöglich, den Unterschied zwischen einem Kurzform-Helfer-Alias ​​und einem Langform-Klassennamen zu erkennen.

Das ultimative "Warum" davon ist wahrscheinlich schwer zu bestimmen - dass die vollständige Instanziierung von Klassennamen überhaupt so funktioniert, kann nur ein Nebeneffekt der Schutzcodierungspraktiken eines Entwicklers sein, die nicht mit dem Wunsch eines anderen Entwicklers nach jedem Modul kompatibel waren eine "Haupt" -Helferklasse. Es kann sich auch um einen einzelnen überarbeiteten Entwickler handeln, der unterwegs schnelle Entscheidungen trifft. Es gibt wahrscheinlich irgendwo eine Lektion in Projektmanagement und Systementwicklung.

Alan Storm
quelle