У меня проблема с 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()
– вызывается на каждом контроллере, включая ваш контроллер входа.
check()
нагрузки на конструктор check()
. /login
. check()
. /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; } } //