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タイプの応答を期待していることだと理解したので、使用する2つのオプション:

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 に答える