我疯了,因为我现在已经使用Codeigniter多年了,而且我似乎无法在我看来加载模型。
这就是我所做的。型号代码( models / changelog.php ):
<?php
class Changelog extends CI_Model {
function __construct() {
parent::__construct();
$this->load->database();
}
function get_list() {
$query = $this->db->get('changelog');
return $query->result();
}
}
/* Location: ./application/models/changelog.php */
这是我的控制器( controllers / explore.php ):
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Explore extends CI_Controller {
public function index() {
$this->load->view('include/header');
$this->load->view('home');
$this->load->view('include/footer');
}
public function changelog() {
$this->load->model('changelog');
$data['changelog_row'] = $this->changelog->get_list();
$this->load->view('include/header');
$this->load->view('explore/changelog', $data);
$this->load->view('include/footer');
}
}
/* Location: ./application/controllers/explore.php */
我收到Codeigniter通知,告诉我消息:未定义属性:探索:: $ Changelog 和PHP错误,致命错误:在非non上调用成员函数get_list()对象
这就是我做的事情
一切正常,也许只是我有点累,但如果有人可以帮助我,我会喜欢它:)。
经过一些测试后我发现错误在
中$data['changelog_row'] = $this->Changelog->get_list();
我的代码行。我不知道问题是什么。区分大小写很好(也尝试了许多小写/大写的组合),即使我创建了另一个具有不同名称的函数(例如foo())并且内部有一个正常的回声,我得到了SAME错误但引用了该函数。
这是一个屏幕
发生了令人难以置信的事情:如果我在 autoload.php 中添加'changelog'模型,它似乎可以实际加载它。到底是怎么回事?我已经在许多应用程序中使用了这段代码而没有任何问题。
我做了另一个测试:如果我写
public function __construct() {
parent:: __construct();
$this->load->model('changelog');
}
在控制器中或只需在changelog函数中添加 parent :: __construct(); ,如
public function changelog() {
parent:: __construct();
$this->load->model('changelog');
$data['changelog_data'] = $this->changelog->get_list();
$this->load->view('include/header');
$this->load->view('explore/changelog', $data);
$this->load->view('include/footer');
}
它适用于O_o。但为什么?我改变了主题标题,现在一切都是我无法在控制器的功能中加载我的模型。
答案 0 :(得分:1)
请使用以下语法更改changelog
功能。
public function changelog() {
$this->load->model('changelog', 'model');
$data['changelog_row'] = $this->model->get_list();
$this->load->view('include/header');
$this->load->view('explore/changelog', $data);
$this->load->view('include/footer');
}
你的模型的功能应该如下:
public function get_list() {
$query = $this->db->get('changelog');
return $query->result();
}
您错过了public
关键字。所以,它现在是一个private
函数,这就是为什么你不能从另一个类访问它。
答案 1 :(得分:1)
$this->load->model('changeLog');
$this->changelog->getList();
答案 2 :(得分:1)
您使用与控制器功能相同的模型名称,因此会发生名称冲突,因为;
$this->changelog()
尝试同时引用您已加载的模型和类方法。
重命名您的Explore :: changelog()函数(或模型名称 - 后缀_m例如),应该没问题。喜欢的东西;
$this->changelog_m->getList();
答案 3 :(得分:0)
经过几个小时的测试并搞砸了所有内容,包括配置文件......我知道了!
这完全是模型和控制器之上的东西,它是关于我所称的钩子的东西。事实上,我有一个名为languageloader.php的钩子,如下所示:
class LanguageLoader extends CI_Controller {
public function initialize() {
$ci =& get_instance();
$site_lang = $ci->session->userdata('site_lang');
if (!empty($site_lang)) {
$ci->lang->load('text', $site_lang);
} else {
$ci->lang->load('text', 'english');
}
}
}
在我的钩子文件中,它被加载为:
$hook['post_controller_constructor'] = array(
'class' => 'LanguageLoader',
'function' => 'initialize',
'filename' => 'languageloader.php',
'filepath' => 'hooks',
);
由于我使用的是 post_controller_constructor ,因此引用CI doc文件
在实例化控制器之后立即调用,但在之前调用 任何方法都在调用。
我相信像我的$ ci =&amp; get_instance();我不能说我该死的模特。我通过更改挂钩来修复它
$hook['pre_controller']
我不认为它可能是关于钩子的东西,这就是我没有发布它的原因。感谢所有试图帮助我的人。我希望这能帮助那些遇到同样麻烦的人!
答案 4 :(得分:0)
供您参考,您可以从
修改autoload.php./应用/配置/ autoload.php
然后只包括模型文件夹中存在的所有模型
./应用/模型/ * _ Model.php
所以从 autoload.php 设置自动加载['模型'] 数组。
/*
| -------------------------------------------------------------------
| Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|
| $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array('Foo_Model', 'Bar_Model', ...);
然后,从您的控制器,您可以从$this->load(...);
中删除__construct()
,因为您从 autoload.php 定义的所有模型都已加载全局并且可以在您运行系统时使用。
然后直接从该模型直接调用您需要的公共方法,就像这样;
$this->Foo_Model->your_public_method_to_call();
PS:
CI_VERSION:3.x
PHP:5.4 +
我希望这对某人有所帮助,谢谢。