CodeIgniter HMVC object_to_array() 错误

32

HMVC:https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/downloads

下载CI并复制HMVC后,出现以下错误:

捕获到未处理的异常

类型:错误

信息:调用未定义的方法MY_Loader::_ci_object_to_array()

文件路径: /Users/k1ut2/Sites/nine.dev/application/third_party/MX/Loader.php

行号:300

回溯:

文件:/Users/k1ut2/Sites/nine.dev/application/controllers/Welcome.php 行号:23 函数:view

文件:/Users/k1ut2/Sites/nine.dev/index.php 行号:315 函数:require_once


你需要在 application > modules > your_module > controllers > Welcome.php 中创建它。 - user4419336
老但经典的教程 https://www.youtube.com/watch?v=8fy8E_C5_qQ - user4419336
我已经正确创建了它,如果原始的欢迎文件被删除,则会返回相同的错误。 - whisky
文件:/Users/k1ut2/Sites/nine.dev/application/controllers/Welcome.php 行:23 函数:view 这是一个错误。 - user4419336
尝试自己操作,下载最新版本并包含HMVC。我已经创建了文件,只是忘记删除旧的文件。但是在删除后,仍然返回相同的错误。我甚至重命名了控制器中所需的视图和函数,但没有成功。 - whisky
5个回答

111

由于Clasyk提供的链接目前无法使用,因此在这里添加一些内容...

从那个帖子中得出的简短版本可以归结为以下几点...

在应用程序/third_party/MX/Loader.php中,您可以执行以下操作...

public function view($view, $vars = array(), $return = FALSE)下查找...(第300行)

return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));

请将此替换为

if (method_exists($this, '_ci_object_to_array'))
{
        return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
} else {
        return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return));
}

这是CI开发人员实施的一个“小”未经记录的更改的结果,这很好!

在Wiredesignz上有一个拉取请求等待处理,所以他知道这件事......

与此同时,您可以实施上述“调整”,然后回到编码中 :)


1
你的if()语句缺少下划线 - 应该是_ci_object_to_array - CapeCoder
隐蔽的未记录功能...感谢快速修复代码,节省了我一些调试时间。 - CapeCoder
非常好的解决方案。对我有用。谢谢。 - Ranjith Siji
哇,太棒了!这是一个很好的解决方案。我之前也遇到了同样的问题,现在我的系统已经正常了。 - Razib Al Mamun
转向警告,问题至今仍存在,Wiredesignz没有拉取这个更正的请求。 - Vinicius Aquino

5
我找到了解决方案,这个对我有效。在 application/third_party/MX/Loader.php 文件的第300行。
这一行代码在CI 3.1.3中会生成错误。
return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));

请用这行文字替换。

return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return));
}

4

在应用程序/core/MY_Loader.php中找到此处。

参考链接:https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/pull-requests/17/fix-loaderphp-for-ci-313/diff#comment-30560940

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');

/* load the MX_Loader class */
require APPPATH."third_party/MX/Loader.php";

class MY_Loader extends MX_Loader
{
    /** Load a module view **/
    public function view($view, $vars = array(), $return = FALSE)
    {
        list($path, $_view) = Modules::find($view, $this->_module, 'views/');

        if ($path != FALSE)
        {
            $this->_ci_view_paths = array($path => TRUE) + $this->_ci_view_paths;
            $view = $_view;
        }

        return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => ((method_exists($this,'_ci_object_to_array')) ? $this->_ci_object_to_array($vars) : $this->_ci_prepare_view_vars($vars)), '_ci_return' => $return));
    }
}

3

HMVC不支持3.1.3(当前版本)。但是支持所有低于3.1.2的版本。我亲自测试了从3.0.0开始的所有版本。


1
好的,我现在已经在CodeIgniter论坛上询问了。我测试过了,你是对的。 - user4419336
6
如论坛链接所述,在 "application\third_party\MX\Loader.php" 文件的第 300 行中将 $this->_ci_object_to_array($vars) 更改为 $this->_ci_prepare_view_vars($vars) 可以解决问题。谢谢。 - Barun
某些错误存在于3.1.11版本中。还有239行(MX/Router.php文件中)的strpos()错误。 - Izzy Helianthus

1

在 application/third_party/MX/Loader.php 的 307 行之后添加以下代码:

protected function _ci_object_to_array($object) 
 {
    return is_object($object) ? get_object_vars($object) : $object;
    }

然而,在3.1.3版本中HMVC不起作用。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接