CodeIgniter:在同一个控制器中加载多个模型

时间:2011-06-06 00:03:32

标签: codeigniter

我搜索了整个互联网,要么没有人提到我的问题,要么我是愚蠢的,或者也许这只是编码的糟糕日子。

情况如何:

  • controller“source”
  • model“source”
  • model“login”

“登录”模型是从 autoload.php 加载的,然后在每个控制器的构造函数中,我有 $ this-> login-> check(),正在检查用户是否已登录(显然)。然后在一些方法中,我使用“源”模型连接到数据库。

我尝试从自动加载阵列中加载两个模型,我也试图以here描述的方式加载它们,但显然是旧的CI版本(该线程来自2008)我尝试了所有我心中可能的方式。

无论如何,结果如下:

  

遇到PHP错误

     

严重性:注意

     

消息:未定义属性:Source :: $ login

     

文件名:controllers / source.php

     

行号:10

     

致命错误:在第10行的... \ application \ controllers \ source.php中的非对象上调用成员函数check()

任何想法我缺少什么或如何修复它?我被困了几个小时,我没有任何想法,我能做什么......

编辑1 :这是“来源”控制器的代码:

  

类Source扩展CI_Controller {

  function __construct() {
      parent::__construct();

      $this->load->model('login');

      $this->login->check();
  }

  function index() {
      // Pagination config, getting records from DB

      $this->load->view('templates/layout', $data);
  }

  function add() {
      $this->load->model('source', '', true);

      $btn = $this->input->post('btn');

      if(isset($btn)) {
          // More form validation

          if($this->form_validation->run() == TRUE) {
              if($btn == "Add") {
                  // here I am supposed to use the source model...
              }
          }
      }

      $data['page'] = 'source_add';

      $this->load->view('templates/layout', $data);
  }
     

}

     

>

编辑2:login.php

  

     

类登录扩展了CI_Model {

  function __construct() {
      parent::__construct();
  }

  function authenticate($username, $password) {
      // the login script comes here
  }

  function logged() {
      if($this->session->userdata('logged') == true) {
          return true;
      } else return false;
  }

  function check() {
      if(!$this->logged()) {
          redirect('/authentication');
      }
  }
     

}

     

>

2 个答案:

答案 0 :(得分:6)

传统上,模型的类名应以_model结尾,因此它不会与具有相同名称的控制器发生冲突,因此请尝试更改

class Login extends CI_Model {

class Login_model extends CI_Model {

答案 1 :(得分:0)

我通过利用钩子解决了这个问题,并将登录过程转换为控制器,从而能够访问用户信息并设置访问级别。

首先,我将以下内容添加到config文件夹中的hooks.php文件中 $hook['post_controller_constructor'][] = array('function' => 'check_login','filename' => 'authority.php','filepath' => 'hooks');

然后我在名为authority.php的挂钩文件中有以下函数

[编辑]审查了这个后,我将其更改为pre_controller_constructor,看看我是否可以删除初始构造中似乎是双页闪存的内容。[/ EDIT]

 function check_login(){
    $CI =& get_instance();

    $is_logged_in = $CI->session->userdata('is_logged_in'); 
    if(!$is_logged_in){
        $unauth_pages = array(your unauthorized pages go here);
        if(!in_array($CI->router->class,$unauth_pages)){
            $CI->session->set_userdata('before_login_url',current_url());
            redirect('login');          
        }
    }
}

function check_authority(){
    $CI =& get_instance();

    if($CI->session->userdata('usergroupID') == 'SUPADMIN'){return;}

    $page = $CI->router->class ;
    $method = $CI->router->method;
    $method = ($method=='index')?'':$method;
    $unauth_pages = array(your unauthorized pages go here); 
    if(in_array($page,$unauth_pages))return;

    $user_group = $CI->session->userdata('usergroupID');
    $CI->load->model('user_model');

    if($user_group == 'ADMIN' || $user_group == 'USER'){
        if($CI->session->userdata('timezone') == ''){
            date_default_timezone_set('Canada/Pacific');    
        } else {
            date_default_timezone_set($CI->session->userdata('timezone'));
        }
    }

    if( !$CI->user_model->authorized_content($CI->session->userdata('usergroupID'),$page, $method)){        
        redirect('unauthorized');
    }   

}

使用上面的内容我不必担心检查每个页面,而是利用ci框架对我进行检查..如果它不在unauth页面数组中那么它是一个需要授权检查的页面。

希望这适合你。