0

我正在学习来自非 MVC OOP 内部框架的 CI,所以我仍然对很多事情感到困惑,我并不总是了解什么是正常的 OO 编程 VS。完成代码点燃方式的事情。无论如何,我会尝试解释我的问题:

我有一个控制器,称为 Admin,它扩展了 CI_Controller。

我创建了一个类(假设自定义类的含义是我所做的不是 CI 的一部分)我将该类放在库文件夹中,该类也扩展了 CI_Controller(该扩展允许我拥有加载方法和其他一些 CI 方法)。

从我的管理控制器,我正在加载我的自定义类(命名为“ComponiPannell”,因为我是意大利人),这样:

$parameters = array('baseUrl' => $this->baseUrl);
$this->load->library('ComponiPannello', $parameters); 

一切正常,我的“ComponiPannillo”确实成功了,并返回了我的管理员视图所需的东西。

现在我想在该类之后加载一个模型,因为我需要将更多信息传递给管理视图,这些信息存储在数据库中,我有一个特定的模型来提取这些额外的信息,所以我添加了几行和代码如下所示:

$parameters = array('baseUrl' => $this->baseUrl);
$this->load->library('ComponiPannello', $parameters);
$setup = $this->componipannello->return_data();
$this->data = array_merge($this->data, $setup);

$this->load->model('categories_model');
$this->data['categories'] = $this->categories_model->get_categories(); 

$this->data 是我传递给管理员视图的内容。

更多信息:

  • 正如我所说,管理控制器和我的自定义类 ComponiPannell 都扩展了 CI_Controller
  • 在 ComponiPannello 我有这个构造函数:

    函数 _构造($params){ 父级:: _construct(); $this->load->library('session'); $this->baseUrl = $params['baseUrl']; }

  • 如果我在 $this->load->library 之前移动 $this->load->model 部分,我没有收到任何错误,一切正常并返回正确的数据,但我想了解我在做什么。

  • 如果我保持原样,我得到的错误如下:

致命错误:在...中的非对象上调用成员函数 get_categories() 在线...

我希望我能够以一种足够清楚的方式解释我的问题,以便您帮助我,提前感谢您花费的时间。

卢克

4

2 回答 2

4

您的问题可能是因为您将另一个控制器作为库加载,而实际上它不是库。

您可以从这样的库中加载库、助手等:

$CI =& get_instance();

从您的库中,而不是$this->load->helper()加载您现在使用的帮助程序$CI->load->helper()

CI 文档中提供了更多信息:http: //ellislab.com/codeigniter/user-guide/general/creating_libraries.html

于 2013-03-13T16:30:39.517 回答
3

为什么你在你的库中使用数据库对象?

在您的库中使用 CodeIgniter 资源。要在您的库中访问 CodeIgniter 的本机资源,请使用 get_instance() 函数。该函数返回 CodeIgniter 超级对象。

通常在你的控制器函数中,你会使用 $this 结构调用任何可用的 CodeIgniter 函数:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc. 

然而,$this 只能直接在你的控制器、模型或视图中工作。如果你想在你自己的自定义类中使用 CodeIgniter 的类,你可以这样做:

首先,将 CodeIgniter 对象分配给一个变量:

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc. 
于 2013-03-13T16:32:52.977 回答