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
你是从推特上得到的,不是吗?:)
Marius

1
@marius你击败了我。Twitter问题即服务。
philwinkle 2014年

@Marius是的-试图鼓励我在Twitter上遇到的问题改为过来。
艾伦·斯托姆

Answers:


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在别名的末尾添加a ,以便该类能够正确解析(catalog/dataMage_Catalog_Model_Data)。

这启用了简短形式的助手,但使Magento无法分辨简短形式的助手别名和长形式类名之间的区别。

最终的“原因”可能很难确定-完整的类名实例化的工作方式完全像是一个开发人员的保护性编码做法的副作用,而这种做法与另一个开发人员对每个模块具有的需求不兼容。一个“主要”助手类。这也可能是一个过度劳累的开发人员在做出快速决策的过程中做出的。在某个地方可能有关于项目管理和系统开发的课程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.