CodeIgniter: пытается вызвать метод конструктора, чтобы проверить, зарегистрирован ли пользователь (вызывает бесконечный цикл перенаправления)

У меня проблема с CodeIgniter 2.1.2 и застряла в течение нескольких часов, пытаясь ее решить: – /

Я знаю, что есть много (!) Потоков, но я не мог найти решение для своей проблемы.

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

class my_class extends CI_Controller { public function __construct(); parent::__construct(); $this->check(); //doesn't work, endless redirection loop } 

«check ()»:

 public function check() { if (! $this->session->userdata('logged_in')) { redirect('/login'); // tried with & without '/' } } 

Метод «login ()» выглядит так:

 public function login() { ... //do form validation stuff and on success: if ($this->form_validation->run() == TRUE) { $this->session->set_userdata('logged_in', TRUE); redirect('/entry'); } //load login_view } 

method "entry ()":

 public function entry() { //$this->check();//Old (redundant) Version //Authorized and Happy... } 

// некоторые другие методы, также сначала вызовите метод check ()

Поэтому мой вопрос: почему вызовы в методах работают (но с большими избыточными вызовами), а вызов в конструкторе дает мне бесконечный цикл? Я что-то пропустил? (Я также не менял вещи в файлах htaccess ..)

Thx заранее 🙂

Чтобы уточнить, что говорили комментаторы:

Игнорируя решение MY_Controller на мгновение, проблема заключается в том, что ваш __construct() а затем, $this->check() – вызывается на каждом контроллере, включая ваш контроллер входа.

  1. Загрузите главную страницу. check() нагрузки на конструктор check() .
  2. Не авторизовано. Перенаправление на /login .
  3. Войти конструктор загружает check() .
  4. Не авторизовано. Перенаправление на /login .

… и так далее и тому подобное.

Решение заключается в проверке того, к какому URL-адресу обращаются , и если он принадлежит вашему логин-контроллеру / методу, то не выполняйте перенаправление.

 public function check() { if ($this->uri->uri_string() !== 'login' && ! $this->session->userdata('logged_in')) { redirect('login'); } } в public function check() { if ($this->uri->uri_string() !== 'login' && ! $this->session->userdata('logged_in')) { redirect('login'); } } 

И наоборот, ваш метод входа в систему должен проверить, действительно ли пользователь уже зарегистрирован, и если да, перенаправите его на свою домашнюю страницу или что-то еще. Но я отвлекся.


Решение MY_Controller включает в себя создание базового контроллера, чей конструктор выполняет зарегистрированную проверку. Затем любые контроллеры, в которых вы хотите выполнить эту проверку, должны расширять MY_Controller вместо CI_Controller .

Обратите внимание, что ваш контроллер входа не будет расширять MY_Controller , потому что вы не хотите выполнять проверку, или ваш бесконечный цикл снова появится.

Трудно быть точным, но здесь.

Я предполагаю, что login () не является методом в классе / контроллере my_class. Если это так, это может быть причиной ошибки, так как каждый раз будет вызываться конструктор.

Лучшим способом было бы обеспечить, чтобы защищенный контроллер расширил CI_Controller, например Auth_Controller. Это было бы в файле application / libraries / MY_Controller.php.

Ваши защищенные контроллеры будут расширять Auth_Controller, а check () будет выполняться в его contructor. Контроллер входа не будет расширять Auth_Controller.

вот несколько быстрых предложений, но сначала убедитесь, что вы загрузите сессионную библиотеку autoload в config / autoload.php

это не класс входа. у вас не было бы переадресации в классе входа в систему, вы просто переходите прямо к $ this-> enterLogin () или независимо от имени метода, чтобы он не зацикливался.

  // Capitalize the first letter of the class!! class My_class extends CI_Controller { public function __construct(); parent::__construct(); // check if login is false // redirect here in the constructor, not buried in a method // note the underscore in the name _checkLogin() to make that method private if ( $this->_checkLogin() == false ) { redirect( '/login/', 'refresh' ); } } // end constructor // private function function _checkLogin(){ if (! $this->session->userdata('logged_in')) { return false ; } else { return true; } } //