Tên lớp đầy đủ trong phương pháp nhà máy của Magento


11

Trong Magento 1, nếu tôi sử dụng tên lớp Magento đầy đủ trong phương thức xuất xưởng, tôi có thể khởi tạo một đối tượng

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

Tuy nhiên, điều tương tự sẽ không làm việc cho người giúp đỡ. Nếu bạn cố gắng

Mage::helper('Mage_Core_Helper_Url');

Bạn lấy

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}

Chuyện gì đang xảy ra vậy?


2
Bạn đã nhận được điều này từ twitter phải không? :)
Marius

1
@marius bạn đánh tôi với nó. Twitter-câu hỏi-như là một dịch vụ.
philwinkle

@Marius Yeah - cố gắng khuyến khích các câu hỏi tôi nhận được trên twitter để đến đây thay thế.
Alan Storm

Câu trả lời:


8

Từ góc độ mã hóa thuần túy, nếu bạn xem getModelClassNamephương thức (một vài cuộc gọi xuống từ ngăn xếp Mage::getModel)

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

bạn sẽ thấy rằng nếu Magento không nhìn thấy /bí danh trong lớp, thì nó giả sử đó là tên lớp đầy đủ. Tuy nhiên, nếu getHelperClassNamechức năng

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

Nếu Magento không thấy /bí danh trong lớp, thì nó giả sử bạn đang sử dụng dạng ngắn của

Mage::helper('catalog')

và thêm một dataphần cuối của bí danh để lớp giải quyết đúng ( catalog/datađến Mage_Catalog_Model_Data).

Điều này cho phép những người trợ giúp biểu mẫu ngắn, nhưng Magento không thể phân biệt được sự khác biệt giữa bí danh của người trợ giúp biểu mẫu ngắn và tên lớp dài.

"Tại sao" cuối cùng của điều này có lẽ khó xác định - rằng việc khởi tạo tên lớp đầy đủ hoạt động như thế hoàn toàn có thể chỉ là tác dụng phụ của các hoạt động mã hóa bảo vệ từ một nhà phát triển không tương thích với mong muốn của một nhà phát triển khác đối với mỗi mô-đun. một lớp người trợ giúp "chính". Nó cũng có thể là một nhà phát triển làm việc quá sức duy nhất đưa ra quyết định nhanh chóng khi họ đi. Có lẽ có bài học về quản lý dự án và phát triển hệ thống ở đâu đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.