如何在控制器的__construct()函数中退出没有die()的codeigniter?

时间:2012-06-24 11:00:06

标签: php codeigniter

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

我该怎么做?如果我这样做了:

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

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

5 个答案:

答案 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进入会话,然后在视图中写入。