CodeIgniter - HMVC,助手和未定义属性

时间:2016-03-30 12:53:37

标签: php codeigniter hmvc

我使用WireDesignz HMVC并使用CodeIgniter 3.0.6拥有一个KERNEL_Controller(实际上是带有另一个前缀的MY_Controller)

class KERNEL_Controller extends MX_Controller {
    public $myvar;

    public function __construct() {
            parent::__construct();

            //Load core Model
            $this->load->model('Core_model');

            $this->myvar = 'test';
    }
} 

现在我有一个Helper,它执行以下操作

function Editor($id) {
    $ci =& get_instance();

    echo $ci->myvar;
} 

当我在视图中调用编辑器时,我得到了

Severity: Notice
Message: Undefined property: CI::$myvar
Filename: helpers/editor_helper.php

在编辑助手

中调用方法时相同

在KERNEL_Controller中我有

public function DoTest() {
    echo '1';
} 

在Editor_helper中

function Editor($id) {
    $ci =& get_instance();    
    echo $ci->DoTest();
} 

我在视图中调用编辑器时得到了

Type: Error
Message: Call to undefined method CI::DoTest()

但是当我在编辑助手中调用模型时

function Editor($id) {
    $ci =& get_instance();

    $result_content = $ci->Core_model->GetLanguages(1);
    print_r($result_content);
} 

我确实得到了(在这种情况下)一个包含语言的数组。

2 个答案:

答案 0 :(得分:1)

哦,是的!!我是男人,我修好了!考虑可能创建我自己的“get_instance()系统,这就是我所做的:

class MY_Controller extends MX_Controller
{
    public static $instance;
    function __construct()
    {
        self::$instance || self::$instance =& $this;
        ...
    }
}

然后在图书馆,帮助者或任何时髦的地方你需要使用它:

$CI =& MY_Controller::$instance;

请注意,如果您自动加载库,MY_Controller :: $ instance将无法正常工作,如果它位于库的__construct()中,因为尚未定义MY_Controller

https://stackoverflow.com/questions/16433210

答案 1 :(得分:0)

根据https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc,您必须使用类似

的内容
<?php
/** module and controller names are different, you must include the method name also, including 'index' **/
modules::run('module/controller/method', $params, $...);

/** module and controller names are the same but the method is not 'index' **/
modules::run('module/method', $params, $...);

/** module and controller names are the same and the method is 'index' **/
modules::run('module', $params, $...);

/** Parameters are optional, You may pass any number of parameters. **/

我不知道您的模块是如何调用的,但您可以尝试

modules::run('module/KERNEL/DoTest');

以便调用DoTest控制器的方法KERNEL