Повні назви класів у фабричних методах Magento


11

У Magento 1, якщо я використовую повне ім'я класу Magento фабричним методом, я можу створити об'єкт

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

Однак те ж саме не допоможе помічникам. Якщо ви спробуєте

Mage::helper('Mage_Core_Helper_Url');

Ви отримуєте

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}

Що відбувається?


2
Ви отримали це з Twitter, чи не так? :)
Маріус

1
@marius ти побив мене до цього. Twitter-питання-як-послуга.
philwinkle

@Marius Так - намагаюся заохотити питання, які я отримую на Twitter, щоб замість цього приходити сюди.
Алан Шторм

Відповіді:


8

З точки зору суто кодування, якщо ви подивитесь на getModelClassNameметод (кілька викликів стека вниз Mage::getModel)

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

ви побачите, що якщо Magento не бачить /псевдонім класу, він передбачає, що це повне ім'я класу. Однак якщо getHelperClassNameфункція

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

Якщо Magento не бачить /псевдонім класу, він передбачає, що ви використовуєте коротку форму

Mage::helper('catalog')

і додає dataдо кінця псевдоніму, щоб клас розв’язувався належним чином ( catalog/dataдо Mage_Catalog_Model_Data).

Це дозволяє помічникам короткої форми, але робить Magento неможливим визначити різницю між псевдонімом помічника короткої форми та назвою класу довгої форми.

Кінцеве "чому" цього, ймовірно, важко визначити - те, що примірник імені повного класу працює так, як це взагалі може бути лише побічним ефектом захисних практик кодування від одного розробника, які були несумісні з бажанням іншого розробника для кожного модуля мати "основний" клас помічників. Це також може бути один перевантажений розробник, який швидко приймає рішення. Напевно, десь є урок управління проектами та розробка систем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.