我有一个问题,笨2.1.2并坚持了几个小时尝试解决这个问题: - /
我知道有关于线程的很多(!),但我无法找到我的问题的解决方案。
我想加载在我的构造函数的方法来检查用户是否登录,所以我想这:
class my_class extends CI_Controller
{
public function __construct();
parent::__construct();
$this->check(); //doesn't work, endless redirection loop
}
“检查()” 是:
public function check()
{
if (! $this->session->userdata('logged_in'))
{
redirect('/login'); // tried with & without '/'
}
}
方法“登录()”是这样的:
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
}
方法 “项()”:
public function entry()
{
//$this->check();//Old (redundant) Version
//Authorized and Happy...
}
//一些其它方法中,也首先调用校验()方法
所以我的问题是,为什么在方法作品(但很多重复的调用),并在构造函数中调用的电话给我一个无限循环? 难道我错过了什么? (我也是在htaccess的文件并没有改变的东西..)
THX提前:-)
要阐述什么评论者说:
忽略MY_Controller
完全解决了一会儿,问题是,你的__construct()
方法-随后, $this->check()
-被称为每个控制器上,包括你的登录控制器。
- 加载网页。 构造负荷
check()
- 没有登录。重定向到
/login
。 - 登录构造负荷
check()
- 没有登录。重定向到
/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
,因为你不希望执行检查,或者你的无限循环将再次出现。
这是很难做到准确,但在这里不用。
我假定登录() 不在 my_class类/控制器的方法。 如果是这样,这可能是错误的原因的构造函数每次被调用。
更好的方法是将有一个安全控制器扩展是CI_Controller,如Auth_Controller。 这将是在应用程序/库/ MY_Controller.php文件。
您的安全控制器将扩大Auth_Controller和检查()将在其构造器中进行。 登录控制器不会扩大Auth_Controller。
这里有一些简单建议,但首先要确保你的config / autoload.php自动加载会议库
这是不是在登录类。 你就不必在登录类重定向,你只需直接进入这个 - $> 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; }
} //
文章来源: CodeIgniter: trying to call constructor method to check if user is logged in (causes endless redirection loop)