CodeIgniter HMVC扩展了MX_Controller,无法正确使用get_instance

时间:2012-09-25 15:24:42

标签: php codeigniter hmvc

我在/ application / core

中有一个控制器

/application/core/CMS_Controller.php

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

require APPPATH."third_party/MX/Controller.php";

class CMS_Controller extends MX_Controller {

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

    public function show_something() {
        echo "something shown";
    }
} 

我在CMS_Controller扩展的模块(/modules/my_module/controllers/controller.php)中有另一个控制器

/modules/my_module/controllers/controller.php

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

class Controller extends CMS_Controller {

    public function index() {
        $this->load->view('view');
    }
} 

并且,在view.php(/modules/my_module/views/view.php)中我这样做: 的 /modules/my_module/views/view.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 $ci =& get_instance();
 echo $ci->show_something();
?> 

我收到了这个错误:

  

致命错误:调用未定义的方法CI :: show_something()in   /home/gofrendi/public_html/No-CMS/modules/my_module/views/view.php on   第3行

如果我不使用MX_Controller并使用CI_Controller,它将起作用: 的 /application/core/CMS_Controller.php

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

//require APPPATH."third_party/MX/Controller.php";

class CMS_Controller extends CI_Controller {

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

    public function show_something() {
        echo "something shown";
    }
} 

有人知道这里有什么问题吗?

3 个答案:

答案 0 :(得分:3)

在application / third_party / MX / Controller.php中 在构造函数的末尾(在第54行之后) 我添加了

/* allow CI_Controller to reference MX_Controller */
CI::$APP->controller = $this;

如果查看代码$ this指的是当前类,它是MX_Controller,CI :: $ APP是指CI_controller(查看MX / Base.php文件)

所以现在很简单...... 获取对CI_Controller的引用 我们会做(按照正常情况)

    $this->CI =& get_instance();

要获得对MX_Controller的引用,我们将做

    $this->CI =& get_instance()->controller;

答案 1 :(得分:1)

我有同样的问题,发现帖子和它让我的网站工作,试试吧?

&#34;除非您计划在另一个控制器中运行控制器,否则不需要扩展MX_Controller。在很多情况下,代码被放入库中。否则,您的控制器应该只扩展MY_Controller。&#34;

在此处找到: http://ellislab.com/forums/viewthread/179478/

答案 2 :(得分:0)

对我而言,你不需要获取实例,所以我的尝试就是这样:

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

 echo $this->show_something();
?> 

而不是

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 $ci =& get_instance();
 echo $ci->show_something();
?> 

无论如何,最好设置自己的库并像下面这样做:

$this->load->library('foo_lib');
$this->foo_lib->show_somenthing();