2

我有一个控制器,在构造函数中,我想检查用户是否登录。如果没有,我希望显示一条错误消息,并让脚本退出而不在控制器中运行任何其他功能。此控制器将仅由 ajax 调用,因此错误将通过 JSON 显示,然后客户端上的 javascript 将其显示给用户。

我怎样才能做到这一点?如果我这样做:

function __construct()
{
   if (! $this->loggedIn() )
   {
      echo json_encode( array('error'=> true) );
      die;
   }    
}

我认为不会显示该消息,因为 codeigniter 使用输出缓冲。有任何想法吗?

4

5 回答 5

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');
}
于 2012-06-24T13:37:44.047 回答
4

我知道您的问题是客户期望 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

你不会有任何缓冲问题,缓冲内容将在模具后发送到客户端......

于 2012-06-24T15:41:07.540 回答
1

我很确定你可以使用这样的东西:

function __construct()
{
   if (! $this->loggedIn() )
   {
     exit('Please login before visiting this page');
   }    
}
于 2012-06-24T11:36:42.570 回答
0

MY_Controller 是您的顶级/父控制器,所以它都在那里完成,因为每个其他控制器都会扩展它。因此,如果您有一个身份验证控制器(它扩展了 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
    }
}
于 2012-06-25T02:44:24.720 回答
-2

我认为您应该使用flashdata并使用它重定向到控制器。然后您可以控制是否有任何 flashdata 进入会话,然后将其写入视图。

于 2012-06-25T08:19:32.363 回答