0

私は Magento 開発チュートリアルMagento for Developers: Part 5 - Magento Models and ORM Basicsに従っています。

クラス名をエコーし​​ようとすると、次のエラーが発生します。PS: 私は Magento 1.7 を使用しています

Warning: get_class() expects parameter 1 to be object, boolean given  in C:\xampp\htdocs\magento\app\code\local\Microdatanet\Weblog\controllers\IndexController.php on line 19

#0 [internal function]: mageCoreErrorHandler(2, 'get_class() exp...', 'C:\xampp\htdocs...', 19, Array)
#1 C:\xampp\htdocs\magento\app\code\local\Microdatanet\Weblog\controllers\IndexController.php(19): get_class(false)
#2 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Controller\Varien\Action.php(419): Microdatanet_Weblog_IndexController->testModelAction()
#3 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Controller\Varien\Router\Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('testModel')
#4 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Controller\Varien\Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#5 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Model\App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#6 C:\xampp\htdocs\magento\app\Mage.php(683): Mage_Core_Model_App->run(Array)
#7 C:\xampp\htdocs\magento\index.php(87): Mage::run('', 'store')
#8 {main}

ファイル: app\code\local\Microdatanet\Weblog\controllers\IndexController.php

<?php
class Microdatanet_Weblog_IndexController extends Mage_Core_Controller_Front_Action {
    public function testModelAction(){   
       $blogpost = Mage::getModel('weblog/blogpost');  
       echo get_class($blogpost); 
    }
}
?>

ファイル: app\code\local\Microdatanet\Weblog\etc\config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Microdatanet_Weblog>
            <version>0.1.0</version>
        </Microdatanet_Weblog>
    </modules>

    <global>
        <models>
            <weblog>
                <class>Microdatanet_Weblog_Model</class>
                <resourceModel>weblog_mysql4</resourceModel>
            </weblog>
            <weblog_mysql4>
                <class>Microdatanet_Weblog_Model_Mysql4</class>
            </weblog_mysql4>
        </models>
    </global>

    <frontend>
        <routers>
            <weblog>
                <use>standard</use>
                <args>
                    <module>Microdatanet_Weblog</module>
                    <frontName>weblog</frontName>
                </args>
            </weblog>
        </routers>
    </frontend>
</config>

ファイル: app\code\local\Microdatanet\Weblog\Model\Blogpost.php

<?php
class Mircodatanet_Weblog_Model_Blogpost extends Mage_Core_Model_Abstract 
{
    protected function _construct()
    {
        $this->_init('weblog/blogpost');
    }   
}
?>
4

1 に答える 1

3

Magentoファクトリメソッドを介してクラスをインスタンス化できない場合、デバッグする方法はいくつかあります。Magentoで鑑別診断を実行する方法を学ぶことは、構成の多用と特定の規則を考えると重要です。

Magentoのすべてのクラス定義は、オートローダー(Varien_Autoload)を介してロードされます(ロードされる必要があります)。オートローダーはで呼び出され、次のインクルードパス設定に依存しますapp/Mage.php

$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
$paths[] = BP . DS . 'lib';

$appPath = implode(PS, $paths);
set_include_path($appPath . PS . Mage::registry('original_include_path'));
include_once "Mage/Core/functions.php";
include_once "Varien/Autoload.php";

Varien_Autoload::register();

これが発生すると、PHPがクラス定義を見つけるために必要なのは、クラス名が上からのインクルードパスに関連するファイルへのパスと一致することだけです。このタイプの自動ロードスキームは、PHPプロジェクトで一般的です。

これは、最初のテスト戦略、つまりクラスを直接呼び出すことを示しています。コントローラのアクションまたはテストファイルで、次の手順を実行します。

$obj = new Microdatanet_Weblog_Model_Blogpost;

PHPがクラス定義を見つけられない場合、これは致命的なエラーをスローします。クラス定義が見つかった場合、それは良いことです。2つのことが当てはまります。渡されたクラス名が与えられた場合のファイルパスが正しいことnewと、ファイル内のクラス名が正しいことBlogpost.phpです。

繰り返しになりますが、これは最近のPHPの典型的な自動読み込みスキームです。Magentoが行うことはbuild、XMLの情報に基づいて、クラス名にいくつかのメソッドを使用することです。参考までに、このファクトリメソッドアプローチが提供する有用な目的は2つだけです。実行時のクラス名の書き換えを可能にすることと、レジストリに単一のインスタンスを登録することです。

上記のようにクラスを呼び出すことができると仮定すると、Mage::getModel('weblog/blogpost')クラスインスタンスが返されない場合は、構成に問題があるはずです。通常、これが発生する理由は3つあります。モジュール構成が含まれていない、モジュール構成の形式が正しくない、または構成が解析されているが内部の情報が使用できない。

では、クラスグループ構成の問題を鑑別診断する方法は?まず、モジュール構成が最初に含まれ、解析されていることを確認します。タグまたはその他の解析できない構文を一致させずにXMLを分割します。構成キャッシュを更新または無効にすると、システムは解析エラーをスローするはずです。そうでない場合は、次の3つのいずれかが発生しています。モジュールがで正しくアクティブ化されていないかapp/etc/modules/[declaration file].xml、モジュールのconfig.xmlファイルが間違った場所にあるか、システムがエラーを抑制しています。テストスクリプトでこれらすべてのトラブルシューティングを行うのは簡単です。

<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors',1);

include 'app/Mage.php';

Mage::setIsDeveloperMode(true);

Mage::app();

var_dump(`Mage::getModel('weblog/blogpost')`);

重要なのは、への呼び出しですsetIsDeveloperMode()。これにより、Magentoは通常は抑制されるエラーを出力します。

この時点で解析エラーがスローされない場合、問題はモジュールconfig.xmlの誤ったxpathまたは値である必要があります。

于 2012-06-21T02:31:51.990 に答える