0

我正在关注 Magento 开发教程Magento for Developers:第 5 部分 - Magento 模型和 ORM 基础知识

当我尝试回显类名时,出现以下错误。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 中执行鉴别诊断非常重要。

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 找不到类定义,那么这将引发致命错误。如果可以找到类定义,那很好,有两件事是正确的:给定传递给的类名,文件路径是正确的new,并且文件内部的类名是正确的Blogpost.php

同样,这是当今 PHP 中典型的自动加载方案。Magento 所做的是build根据 XML 中的一些信息对类名使用一些方法。仅供参考,这种工厂方法方法只提供两个有用的目的:允许运行时类名重写,以及在注册表中注册单个实例。

假设可以像上面那样调用该类,如果Mage::getModel('weblog/blogpost')不返回类实例,则问题必须出在配置上。出现这种情况通常有以下三种原因:模块配置没有被包含,模块配置格式错误,或者配置被解析但里面的信息不可用。

那么,如何鉴别诊断类组配置问题呢?首先,确保首先包含和解析模块配置:通过不匹配的标签或其他无法解析的语法来破坏 XML。刷新或禁用配置缓存,系统会抛出解析错误。如果不是,则发生了以下三种情况之一:模块未正确激活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 回答