2011-11-24 15 views
7

レッツが言うあらゆる方法で使用するセッションをチェックする方法、私は、ユーザーせずに使用することができるように get_book();read_book();remove_book();CodeIgniterのは - <strong>ブック</strong>という名前の私のコントローラで

クラスではありませんメソッドをなど、多くの方法を、持っていますログインしてセッションからuser_idを得ることができます。

私の質問は、どのような/私は方法を使用できるようにuser_idセッションが設定されている場合を確認するための最良の方法は?

if($this->is_logged_in() 
{ 
    //do something 
} 
else 
{ 
    //redirect to home 
} 

よう

今私は is_logged_in()メソッドを作成することを考えていますについては

、とのif-else文で、すべてのメソッドに適用するには、それは長くて退屈ではないですか?これを達成する究極の方法はありますか?

私はリンクに

codeigniter check for user session in every controller

を読んしかし、私はまだすべての方法でis_logged_inチェックを適用する必要があることと思われます。

ありがとうございました!

答えて

11

/application/coreMY_controller.phpを(接頭辞が設定ファイルで編集することができます)と呼ばれるファイルを作成します。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Controller extends CI_Controller { 


    function __construct() 
    { 

     parent::__construct(); 

     //Initialization code that affects all controllers 
    } 

} 


class Public_Controller extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 

     //Initialization code that affects Public controllers. Probably not much needed because everyone can access public. 
    } 

} 

class Admin_Controller extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
     //Initialization code that affects Admin controllers I.E. redirect and die if not logged in or not an admin 
    } 

} 

class Member_Controller extends MY_Controller { 

    function __construct() 
    { 
     parent::__construct(); 

     //Initialization code that affects Member controllers. I.E. redirect and die if not logged in 
    } 

} 

新しいコントローラを作成するときはいつでも、必要なアクセスを決定します

class Book extends Member_Controller { 

     //Code that will be executed, no need to check anywhere if the user is logged in. 
     //The user is guaranteed to be logged in if we are executing code here. 

//If you define a __construct() here, remember to call parent::__construct(); 
    } 

Book以外のメンバーコントローラーが必要な場合は、Member_Controllerを拡張することができるので、コードの複製が大幅に削減されます。すべてをチェックする必要はありません。

+0

私はあなたの答えを理解しました。これは本当にDRYに従っており、ユーザーの異なるグループに正しいビジネスルールを適用するのに役立ちます。ありがとう、@ケマル・カーネルはあなたの助けを借りてとてもそうです:) – user826224

9

必ずしもそうする必要はありません。単純にログインチェックコードをコンストラクタに入れれば、すべて設定されます!

class Book extends CI_Controller 
{ 
    public function __construct() 
    { 
     if ($this->is_logged_in()) 
     { 
      // redirect to home 
     } 
    } 

    public function get_book() 
    { 
     ... 
    } 

    // The rest of the code... 
} 
+0

ありがとう、私はテストし、それは完璧に動作します。リンクから更新するには、MY_Controllerをapplication/coreの下に置く必要があります。再び、あなたの助けを感謝:)素敵な一日を! – user826224

+2

@ user826224、これでコードを複製する必要があります。私の答えは、あなたがリンクしているものとはかなり異なります。慎重に読むべきです:) – Esailija

0

あなたは次のように、コントローラのコンストラクタでメソッドを使用することができます。

 
if (! $this->session->userdata('logged_in')) 
    { 
      redirect('login'); 
    } 

関連する問題