从控制器调用模型方法“调用非对象上的成员函数...”,但在从视图调用时起作用

时间:2013-10-07 12:37:45

标签: php codeigniter

从控制器功能调用模型方法的时间最长。几个小时后,阅读了许多关于“调用成员函数......非对象”和“未定义属性:Main :: $ form_model ”的文章“等等,我还没有找到任何解决方案(显然,或者我不会在这里找到)。只是让你知道我不想试着带着这个问题轻松过关。

我的模型文件夹包含此模型:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Form_model extends CI_Model {

    function __construct()
    {
        // Call the Model constructor
        parent::__construct();
    }

    public function update_profile(){
        $data = array();
        $formValues = $this->input->post();
        $this->db->where('member_id', $data['member_id']);
        $this->db->update('members', $data); 
    }


}

在我的Main类控制器中,我正在加载这样的helpers / libraries / models:

class Main extends CI_Controller {

     public function __construct(){
        parent::__construct();
        // Your own constructor code
        $this->load->helper(array('cookie','form','url'));
        $this->load->library('../controllers/accessories');
        $this->load->model(array('registration_model','form_model'));
     }

这些正确加载。我知道它们正确加载,因为如果我更改任何模型的任何字母,CodeIgniter会抛出一个无法加载模型的错误。

我的Main类中的最后一个函数与表单的操作页面相关联。表单页面是一个外部视图(在“views”文件夹中),它也调用具有相同名称的内部视图,但它位于“views / content”文件夹中,如下所示:

<?php $this->load->view("top"); ?>
<!-- CONTENT BEGIN -->

<?php $this->load->view("content/profile_management"); ?>

<!-- CONTENT END -->
<?php $this->load->view("bottom"); ?>

您可以看到此模板三明治的“内容”中间调用第三级视图,而在$role == 1的情况下,将调用“forms / profile_manager_form”:

<?php 
if ($this->uri->segment(3) === FALSE){
    if($this->input->cookie('member')){
        $member_id = $this->input->cookie('member');
    }
    else{
        $member_id = 0;
    }
}
else{
    $member_id = $this->uri->segment(3);
}

$query = $this->db->get_where('members', array('member_id' => $member_id));
foreach ($query->result() as $row){
    $role = $row->role;
}
switch($role){
    case "1" :
        $this->load->view('forms/profile_manager_form');
        break;
    case "2" :
        $this->load->view('forms/portfolio_manager_analyst');
        break;  
}
?>

提交个人资料更新表单后,操作页面为“profile_form”:

<?php $this->load->view("top"); ?>
<!-- CONTENT BEGIN -->

<?php $this->load->view("content/profile_form"); ?>

<!-- CONTENT END -->
<?php $this->load->view("bottom"); ?>

此页面位于“views”文件夹中,本身调用“views / content”文件夹中的第二级视图,名为“profile_form”:

<?php
foreach($_POST as $k => $v){
    echo "$k = $v <br>";
}

$this->form_model->update_profile();
?>

...正如您所看到的,我已将呼叫置于此处update_profile,并且可以正常运行。但我不认为我想用我的控制器Main类调用一些模型函数来构建这个网站,而从视图页面调用其他模型函数,因为这是他们似乎唯一工作的地方。 / p>

在我的控制器的Main类中,我的最后一个函数是我认为应该放置函数调用的地方:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Main extends CI_Controller {

     public function __construct(){
        parent::__construct();
        // Your own constructor code
        $this->load->helper(array('cookie','form','url'));
        $this->load->library('../controllers/accessories');
        $this->load->model(array('registration_model','form_model'));
     }

     public function index()
     {
        $config = array();
        $root = "http://".$_SERVER['HTTP_HOST'];
        $root .=     str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
        $config['base_url']    = "$root";
        $data = array();
        $data['scripts'] = $this->accessories->getScripts($config);
        $this->load->view('home',$data);
     }

     public function profile_form(){
        $config = array();
        $root = "http://".$_SERVER['HTTP_HOST'];
        $root .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
        $config['base_url'] = "$root";
        $data = array();
        $data['states'] = $this->accessories->states();     
        $data['scripts'] = $this->accessories->getScripts($config);
        $this->form_model->update_profile(); //I want to put my model function call here, but CI gives me the "not an object" error.
        $this->load->view('profile_form',$data);
    }

}

更新 请参阅下面的答案。

2 个答案:

答案 0 :(得分:0)

尝试这种方式加载模型

$this->load->model('registration_model');
$this->load->model('form_model');

答案 1 :(得分:0)

我想我发现__construct中对象的加载顺序很重要。这让我疯了。我研究过“模块助手库是否有加载顺序?”我没有找到任何东西。但是,它确实有所作为。

这是我原来的一个父__constructs:

public function __construct(){
    parent::__construct();
    // Your own constructor code
    $this->load->helper(array('cookie','form','url'));
    $this->load->library('../controllers/accessories','form_validation');
    $this->load->model(array('login_model','registration_model','form_model'));
 }

我只是按字母顺序排列,“h”表示帮助,“l”表示库,“m”表示模型。

我在另一个模型的不同方法(对象 login_model 中的方法 validate())上再次遇到“非对象”错误。这真的开始让我失望了。

我还能做什么,知道我的模型和方法在语法上是正确的,并且知道我正确地调用它们,特别是在网上搜索这个问题并且做得很短?所以,我改变了模型/库/助手的加载顺序,如下所示:

public function __construct(){
    parent::__construct();
    // Your own constructor code
    $this->load->model(array('login_model','registration_model','form_model'));
    $this->load->helper(array('cookie','form','url'));
    $this->load->library('../controllers/accessories','form_validation');
 }

...现在我没有收到错误,我的方法也有效。