Codeigniter - 只能在autoload.php中加载模型

时间:2014-10-26 13:25:04

标签: php mysql database codeigniter model

我疯了,因为我现在已经使用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()对象

这就是我做的事情

  • 尝试自动加载数据库,而不是仅将其加载到该模型中
  • 尝试将控制器中的Changelog调用更改为小写
  • 检查了与数据库的连接
  • 启用了日志文件,该文件没有告诉我任何新内容

一切正常,也许只是我有点累,但如果有人可以帮助我,我会喜欢它:)。


经过一些测试后我发现错误在

$data['changelog_row'] = $this->Changelog->get_list();

我的代码行。我不知道问题是什么。区分大小写很好(也尝试了许多小写/大写的组合),即使我创建了另一个具有不同名称的函数(例如foo())并且内部有一个正常的回声,我得到了SAME错误但引用了该函数。

这是一个屏幕 enter image description here


发生了令人难以置信的事情:如果我在 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。但为什么?我改变了主题标题,现在一切都是我无法在控制器的功能中加载我的模型。

5 个答案:

答案 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)

CI对此表现得有点奇怪。 Om unix系统(其中文件名区分大小写)您必须使用大小写敏感名称加载模型。 但是在控制器中,你应该用小写字母来表示它,即

$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 +

我希望这对某人有所帮助,谢谢。