【问题标题】:Fatal error with Custom Magento Module on one server but not the other一台服务器上的自定义 Magento 模块出现致命错误,但另一台服务器上没有
【发布时间】:2011-01-16 15:25:13
【问题描述】:

我正在 Magento 中创建自己的自定义模块,并且在 Litespeed 服务器 (PHP v5.2.14) 上进行测试期间,我得到了一个 Fatal Error: Call to a member function batch() on a non-object in ../../../BatchController.php on line 25,它在另一台 linux 服务器和 wamp 服务器 (PHP v5.1) 上的测试期间没有出现。 2.11)。

这个让我难过。我猜它与服务器配置有关,而不是代码本身。但我只是猜测。我希望这里有人能告诉我。

除了 php 版本和环境之外,我能看到的唯一真正的主要区别是出现错误的服务器使用的是 Suhosin 补丁。但这会导致这种情况吗?

有问题的行是Mage::getModel('mymodule/mymodel')->batch();,它包含在 IF 语句中。 batch() 是位于我的模型文件中的公共函数。

如果您需要更多代码,请告诉我。

谢谢!

【问题讨论】:

  • 你 100% 确定这是有问题的行吗?因为remove() 应该在那里。您是否 100% 确定您正在查看正确的文件?
  • 我 100% 确定。 remove() 在那里,因为我正在查看它是否发生在另一个以相同方式调用的函数中,并且确实发生了。

标签: php magento module fatal-error member-functions


【解决方案1】:

如果您在调用模型时收到“非对象”错误,则 Magento 尝试获取您的模型类时存在问题,并且它返回 null。其原因并不总是显而易见的。如果这在普通 LAMP 堆栈上同样有效,那么问题很可能不在您的代码中。

我的第一个猜测是该文件没有适当的权限。否则,它可能与解析类名有关。您可以通过像这样直接调用插件来临时测试它:

$obj = new Mynamespace_Mymodule_Model_Mymodel();
$obj->batch();

如果这可行,那么该文件是可读的,并且您将希望深入研究该类名的解析。如果它不起作用,则说明自动加载或类的声明存在问题。

希望有帮助!

谢谢, 乔

【讨论】:

  • @Joe:使用上面的方法一切正常。你能详细说明“在那个类名的解析中探索”吗?仅使用上述代码生成会出现什么问题?非常感谢!
  • 我很高兴该代码对您有用。反对使用它的理由是你现在已经成功地完全避免了 Magento,这可能会在路上给你带来麻烦。看看 Alan 的关于获取类名的代码,这就是你的问题所在。您的配置没有被读取(至少不是您认为的那样),需要在开发时进行更正。
【解决方案2】:

打破它。

你试图打电话

Mage::getModel('mymodule/mymodel')->batch();

PHP 告诉你它试图在一个非对象上调用方法批处理。这意味着

Mage::getModel('mymodule/mymodel')

没有按照应有的方式返回模型对象。

首先要做的是清除您遇到问题的服务器上的 Magento 缓存。如果您的 Module 配置尚未加载到全局配置树中,Magento 将尝试实例化 Mage_Core_Model_Mymodel,但失败。

第二步是确保您的模块的app/etc/module 文件就位。

第三步是在实例化对象的方法中添加一些调试(假设是 1.4 分支)并确定 为什么 Magento 无法创建对象

File:   app/code/core/Mage/Core/Model/Config.php
...
public function getModelInstance($modelClass='', $constructArguments=array())
{
    $className = $this->getModelClassName($modelClass);
    if (class_exists($className)) {
        Varien_Profiler::start('CORE::create_object_of::'.$className);
        $obj = new $className($constructArguments);
        Varien_Profiler::stop('CORE::create_object_of::'.$className);
        return $obj;
    } else {
        #throw Mage::exception('Mage_Core', Mage::helper('core')->__('Model class does not exist: %s.', $modelClass));
        return false;
    }
}
...    

【讨论】:

  • 感谢您的提示。我没有运气清除缓存。所有文件都在正确的位置。当我使用 getModelInstance 它返回 false。
  • @Jack:然后在其中添加调试代码并找出它返回错误的原因。检查变量“$className”中的字符串。如果该方法返回 false,那是因为该类不存在。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2010-12-30
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2020-04-04
  • 1970-01-01
相关资源
最近更新 更多