ชื่อเต็มของคลาสในวิธีโรงงานของวีโอไอพี


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 คุณเอาชนะฉันไป ทวิตเตอร์คำถาม-as-a-Service
philwinkle

@Marius Yeah - พยายามที่จะสนับสนุนคำถามที่ฉันได้ที่ Twitter มาที่นี่แทน
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 ไม่เห็น/ชื่อแทนในคลาสมันจะถือว่าเป็นชื่อเต็มของคลาส อย่างไรก็ตามหากgetHelperClassNameฟังก์ชั่น

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

หากวีโอไอพีไม่เห็น/นามแฝงในคลาสมันจะถือว่าคุณใช้รูปแบบย่อของ

Mage::helper('catalog')

และเพิ่ม a dataไปที่ท้ายนามแฝงเพื่อให้คลาสแก้ไขอย่างถูกต้อง ( catalog/dataไปMage_Catalog_Model_Data)

สิ่งนี้ช่วยให้ผู้ช่วยแบบสั้น ๆ แต่ทำให้เป็นไปไม่ได้ที่วีโอไอพีจะบอกความแตกต่างระหว่างนามแฝงตัวช่วยแบบสั้นกับชื่อคลาสแบบยาว

สุดยอด "ทำไม" นี่อาจเป็นเรื่องยากที่จะปักหมุด - การที่ชื่อเต็มคลาสทำงานได้อย่างนั้นอาจเป็นผลข้างเคียงของการป้องกันการเข้ารหัสจากผู้พัฒนารายหนึ่งที่ไม่เข้ากับความต้องการของนักพัฒนารายอื่นสำหรับแต่ละโมดูล ชั้นผู้ช่วย "หลัก" นอกจากนี้ยังอาจเป็นนักพัฒนาที่ทำงานหนักเกินไปคนเดียวตัดสินใจอย่างรวดเร็วในขณะที่ไป อาจมีบทเรียนเกี่ยวกับการจัดการโครงการและการพัฒนาระบบในบางแห่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.