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
ツイッターからもらったよね?:)
マリウス

1
@mariusあなたは私を倒しました。Twitter-questions-as-a-service。
philwinkle 2014年

@Marius Yeah —代わりに私がTwitterで受け取った質問をここに来るように奨励しようとしています。
アランストーム

回答:


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/datato Mage_Catalog_Model_Data)。

これにより、短い形式のヘルパーが有効になりますが、Magentoが短い形式のヘルパーエイリアスと長い形式のクラス名の違いを認識できなくなります。

これの究極の「理由」を突き止めることはおそらく難しい—完全なクラス名のインスタンス化がそのように機能するのは、各モジュールが持つ別の開発者の欲望と互換性のない、ある開発者からの保護コーディングプラクティスの副作用にすぎない可能性がある「メイン」ヘルパークラス。彼らはまた、彼らが行くにつれて迅速な決定を下す単一の過労開発者かもしれません。おそらくどこかでプロジェクト管理とシステム開発の教訓があるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.