마 젠토 팩토리 메소드의 전체 클래스 이름


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 당신은 저를 이겼습니다. 트위터 질문 서비스로.
philwinkle

@Marius 그래 — 트위터에서받는 질문들을 여기로 오게하려고 노력하십시오.
Alan Storm

답변:


8

순수한 코딩 관점에서 볼 때 getModelClassName메소드를 살펴보면 (에서 몇 번의 호출을 통해 Mage::getModel)

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

Magento가 /클래스 별칭에 a 를 표시하지 않으면 전체 클래스 이름 인 것으로 가정합니다. 그러나 getHelperClassName기능이

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

Magento가 /클래스 별칭에 a 를 표시하지 않으면 짧은 형식의

Mage::helper('catalog')

data클래스가 올바르게 확인되도록 별칭을 끝에 추가 합니다 ( catalog/data~ Mage_Catalog_Model_Data).

이렇게하면 짧은 형식 도우미가 가능하지만 Magento가 짧은 형식 도우미 별칭과 긴 형식 클래스 이름의 차이점을 구분할 수 없습니다.

이것의 궁극적 인 "이유"는 아마도 찾기가 어려울 것입니다. 전체 클래스 이름 인스턴스화는 전혀 작동하지 않습니다. 각 모듈에 대한 다른 개발자의 요구와 호환되지 않는 한 개발자의 보호 코딩 방식의 부작용 일 수 있습니다. "메인"헬퍼 클래스 또한 한 번의 과로 개발자가 빠른 결정을 내릴 수 있습니다. 어딘가에 프로젝트 관리 및 시스템 개발에 대한 교훈이있을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.