我有一个控制器,在构造函数中,我想检查用户是否登录。如果没有,我希望显示一条错误消息,并让脚本退出而不运行控制器中的任何其他功能。此控制器仅由ajax调用,因此错误将通过JSON显示,然后客户端上的javascript将显示给用户。
我该怎么做?如果我这样做了:
function __construct()
{
if (! $this->loggedIn() )
{
echo json_encode( array('error'=> true) );
die;
}
}
我不认为会显示该消息,因为codeigniter使用输出缓冲。有什么想法吗?
答案 0 :(得分:4)
最好的方法是将用户重定向到登录页面。 如上所述:https://stackoverflow.com/a/10399199/876117
public function __construct(){
parent::__construct();
if(!userLoggedIn())
$this->load->view('promptlogin');
$this->output->_display();
exit();
}
public function index(){
// one will never reach here unless he is logged in
$this->load->view('actualcontent');
}
答案 1 :(得分:3)
我明白你的问题是客户期望的json类型的响应,因此有两个选项可供使用:
public function __construct(){
$_bad_login_msg = 'please try again' ;
parent::__construct();
if(!userLoggedIn()){
$this->output
->set_content_type('application/json')
->set_output(json_encode($_bad_login_msg));
//or just use
// echo json_encode($_bad_login_msg);
die;
}
}
http://codeigniter.com/user_guide/libraries/output.html
你不会有任何缓冲问题,缓冲内容将被发送到客户端 之后...
答案 2 :(得分:1)
我很确定你可以使用这样的东西:
function __construct()
{
if (! $this->loggedIn() )
{
exit('Please login before visiting this page');
}
}
答案 3 :(得分:0)
MY_Controller是你的顶级/父控制器所以它全部在那里完成,因为每个其他控制器都会扩展它。因此,如果您有一个auth控制器(扩展了MY_Controller),您将可以访问其逻辑。
所以MY_Controller
class MY_Controller extends CI_Controller{
protected $_user;
public function __construct(){
parent::__construct();
$this->_user = $this->session->userdata('uid')
? find_a_user : NULL;
// if a session of user_id exists and is found in DB
// we have a live user
}
}
<强>验证强>
class Auth extends MY_Controller{
public function __construct(){
parent::__construct();
// we now have access to $this->_user
if($this->_user !== NULL) // we have active user
}
}
答案 4 :(得分:-2)
我认为您应该使用flashdata并使用它重定向到控制器。然后你可以控制是否有任何flashdata进入会话,然后在视图中写入。