7

我在 /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();
?> 

我得到这个错误:

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

如果我不使用 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";
    }
} 

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

4

3 回答 3

4

在构造函数末尾的 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;
于 2013-07-22T17:07:32.383 回答
1

我遇到了同样的问题,找到了那个帖子,它使我的网站正常工作,试试看吧?

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

在这里找到:http: //ellislab.com/forums/viewthread/179478/

于 2013-05-07T23:37:53.780 回答
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();
于 2013-01-06T20:48:40.023 回答