Nama Kelas Penuh dalam Metode Pabrik Magento

11

Di Magento 1, jika saya menggunakan nama kelas Magento penuh dalam metode pabrik, saya bisa instantiate objek

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

Namun, hal yang sama tidak akan berhasil untuk pembantu. Jika kamu mencoba

Mage::helper('Mage_Core_Helper_Url');

Anda mendapatkan

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}

Apa yang sedang terjadi?

Alan Storm
sumber
2
Anda mendapat ini dari twitter bukan? :)
Marius
1
@Marius Anda mengalahkan saya untuk itu. Twitter-pertanyaan-sebagai-layanan.
philwinkle
@Marius Yeah - mencoba mendorong pertanyaan yang saya dapatkan di twitter untuk datang ke sini sebagai gantinya.
Alan Storm

Jawaban:

8

Dari perspektif pengkodean murni, jika Anda melihat getModelClassNamemetode ini (beberapa panggilan dari stack Mage::getModel)

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

Anda akan melihat bahwa jika Magento tidak melihat /alias di kelas, diasumsikan itu adalah nama kelas penuh. Namun, jika getHelperClassNamefungsinya

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

Jika Magento tidak melihat /alias di dalam kelas, diasumsikan Anda menggunakan bentuk pendek dari

Mage::helper('catalog')

dan menambahkan a datake akhir alias sehingga kelas menyelesaikan dengan benar ( catalog/datake Mage_Catalog_Model_Data).

Ini memungkinkan pembentuk formulir pendek, tetapi membuatnya tidak mungkin bagi Magento untuk membedakan antara alias pembantu bentuk pendek dan nama kelas bentuk panjang.

"Mengapa" akhir dari ini mungkin sulit untuk dijabarkan - bahwa instantiasi nama kelas penuh bekerja seperti itu sama sekali mungkin hanya efek samping dari praktik pengkodean pelindung dari satu pengembang yang tidak sesuai dengan keinginan pengembang lain untuk setiap modul untuk memiliki kelas pembantu "utama". Ini juga mungkin merupakan satu-satunya pengembang yang bekerja terlalu keras membuat keputusan cepat saat mereka pergi. Mungkin ada pelajaran dalam manajemen proyek dan pengembangan sistem di suatu tempat di sana.

Alan Storm
sumber