CodeIgniter: загрузка нескольких моделей в одном контроллере - PullRequest
4 голосов
/ 06 июня 2011

Я обыскал весь Интернет, и либо никто не упомянул мою проблему, либо я тупой, либо, возможно, это просто плохой день для кодирования.

Какова ситуация:

  • контроллер "источник"
  • модель "источник"
  • модель "логин"

Модель входа в систему загружается из autoload.php , затем в конструкторе каждого контроллера у меня есть $ this-> login-> check () , который проверяет, является ли пользователь вошел в систему (очевидно). Затем в некоторых методах я использую модель «источник» для подключения к базе данных.

Я попытался загрузить обе модели из массива автозагрузки, я также попытался загрузить их, как описано здесь , но это очевидно для старой версии CI (поток от 2008), и я перепробовал все возможные способы, которые я имел в виду.

В любом случае, результат таков:

Произошла ошибка PHP

Серьезность: Уведомление

Сообщение: неопределенное свойство: Source :: $ login

Имя файла: controllers / source.php

Номер строки: 10

Неустранимая ошибка: вызов функции-члена check () для необъекта в ... \ application \ controllers \ source.php в строке 10

Есть идеи, что мне не хватает или как это исправить ...? Я застрял на несколько часов, и у меня нет никаких идей, что я мог бы сделать ...

Редактировать 1 : вот код из «исходного» контроллера:

Источник класса расширяет 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 ]

6 голосов
/ 06 июня 2011

Обычно имя класса Моделей должно заканчиваться на _model, чтобы оно не сталкивалось с контроллерами с одинаковыми именами, поэтому попробуйте изменить

class Login extends CI_Model {

до

class Login_model extends CI_Model {
0 голосов
/ 11 апреля 2015

Я решил эту проблему, используя перехватчики, и превратил процесс входа в систему в контроллер, благодаря чему я смог получить доступ к пользовательской информации и настроить уровни доступа.

Сначала я добавил следующее в файл hooks.php в папке config $hook['post_controller_constructor'][] = array('function' => 'check_login','filename' => 'authority.php','filepath' => 'hooks');

Тогда у меня есть следующие функции в файле ловушек с именем author.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, то это страница, требующая проверки авторизации.

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...