Php Codeigniter/OOP:加载自定义类后,我可以';不要加载模型
我从一个非MVC OOP内部框架学习CI,所以我仍然对一大堆事情感到困惑,我并不总是理解什么是正常的OO编程,什么是以代码点火器的方式完成的。无论如何,我将尝试解释我的问题: 我有一个名为Admin的控制器,它扩展了CI_控制器 我创建了一个类(假设自定义类的意思是我创建的不是ODCI的一部分),我将该类放在库文件夹中,该类还扩展了CI_控制器(该扩展允许我使用load方法和其他一些CI方法) 从我的管理控制器,我正在加载我的自定义类(因为我是意大利人,所以名为“ComponiPannello”),方法如下:Php Codeigniter/OOP:加载自定义类后,我可以';不要加载模型,php,oop,codeigniter,Php,Oop,Codeigniter,我从一个非MVC OOP内部框架学习CI,所以我仍然对一大堆事情感到困惑,我并不总是理解什么是正常的OO编程,什么是以代码点火器的方式完成的。无论如何,我将尝试解释我的问题: 我有一个名为Admin的控制器,它扩展了CI_控制器 我创建了一个类(假设自定义类的意思是我创建的不是ODCI的一部分),我将该类放在库文件夹中,该类还扩展了CI_控制器(该扩展允许我使用load方法和其他一些CI方法) 从我的管理控制器,我正在加载我的自定义类(因为我是意大利人,所以名为“ComponiPannello”
$parameters = array('baseUrl' => $this->baseUrl);
$this->load->library('ComponiPannello', $parameters);
一切都很完美,我的“ComponiPannello”完成了任务,并返回了一些我需要的管理视图
现在我想在该类之后加载一个模型,因为我需要将更多信息传递给Admin视图,这些信息存储在DB中,我有一个特定的模型来提取这些额外的信息,所以我添加了几行代码,代码如下所示:
$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();
WARE$this->数据是我传递给管理员视图的内容
更多信息:
- 正如我所说,Admin controller和我的定制类ComponiPannello都扩展了CI_控制器
- 在ComponiPannello中,我有一个构造函数: 函数构造($params){ 父项::_构造(); $this->load->library('session'); $this->baseUrl=$params['baseUrl']; }
- 如果我将$this->load->model部分移动到$this->load->library之前,我不会得到任何错误,一切正常,并返回正确的数据,但我想了解我在做什么
- 如果我保持原样,我得到的错误如下:
Luke您的问题可能是因为您正在加载另一个控制器作为库,而实际上它不是库 可以从库中加载库、帮助程序等,如下所示:
$CI=&get_instance()代码>
从您的库中,您现在可以使用$CI->load->helper()
而不是$this->load->helper()
来加载助手
有关这方面的更多信息,请参阅CI文档:在您的库中使用数据库对象是什么
利用库中的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.
感谢您的帮助,我在CI手册中读到了类似的内容,但我不确定这是否是我的问题,但最重要的是,我没有100%清楚如何使用它,所以基本上在我的类(ComponiPannello)中,而不是使用$this->load->model,我必须按照您刚才说的做,对吗?所以$CI=&get_instance();。。。等等,对吗?另外两个问题:从我的自定义类扩展CI_控制器是否正确?从你上面写的来看是没有用的。为什么要写“你在你的库中使用数据库对象做什么?”我应该怎么做?从控制器中提取,然后将结果传递给类?类库需要做什么。解释我创建这个类是为了分割管理员必须做的事情,我的管理员控制器执行几个功能,因此我创建了ComponiPannello(英文ComposePanel),它负责呈现视图(基本上帮助我更好地组织管理员)。它需要数据库,因为它为管理员视图设置数据,处理从数据库中提取的数据,并将它们作为简单数组返回给管理员,准备传递给视图。为此,您不需要新的lib类。进入核心文件夹,制作管理员控制器并扩展MX或CI控制器。在你的构造器中定义你所需要的一切。您可以强制登录系统,所有扩展管理员控制器的页面都必须登录。试试这个更好。是:$CI=&get_instance();将被放置在我加载的库的_构造中?因此,我通常从控制器加载库,在库中放入$CI=&get_instance();i、 在构造中,然后$CI->load->helper()在其他任何地方?您可以将其添加到构造函数中,但除非将其设置为类变量,否则您将无法从其他类函数中获得作用域。或者,只需将它添加到您需要从中访问它的任何函数中。