我正在关注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);
}
}
?>
FILE: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');
}
}
?>
答案 0 :(得分: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无法找到类定义,那么这将引发致命错误。如果可以找到类定义,那很好,有两件事情是正确的:文件路径是正确的,因为类名传递给new
,类名在Blogpost.php
文件中是正确的。
同样,这是目前PHP中的典型自动加载方案。 Magento所做的是根据XML中的一些信息使用某些方法来build
一个类名。仅供参考,此工厂方法方法提供了两个有用的用途:允许运行时类名重写,并在注册表中注册单个实例。
假设可以像上面那样调用类,如果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或值不正确。