0

重複の可能性:
さまざまな関数のコンストラクターセッションの検証

フレームワーク:CI(CodeIgniter)

状況

私は4ページ(コントローラー)を持っています:すなわち:

home login dashboard editprofile

アクセス

  • ログインしているかどうかに関係なく、すべてのタイプのユーザーがホームにアクセスできます

  • ログインは、認証されていない場合にのみアクセス可能である必要があります

  • ダッシュボードとeditprofileには、学生(認証されたユーザー)のみがアクセスできます。

私はこのような私のコントローラーのためにこの検証を持っています:

if($this->session->userdata('isLoggedIn')){
    // stay here do the function
} else {
// leave this page
    header('Location:'.base_url().'login');
}

私は私の中にそれを持っていfunction index(){}ます。

しかし、私がシステムを開発するにつれて、私がより多くのメソッド、より多くのコントローラーを作成するにつれて、それはより厄介になります。あなたがこれを使用する必要があるからです。

if($this->session->userdata('isLoggedIn')){
// stay here do the function
} else {
// leave this page
header('Location:'.base_url().'login');
}

あなたが方法を持っているたびに、

私はstackoverflowでいくつかの質問を読みました...そして唯一の最良の答えはこれです:ここにリンク

そのためにデコレータパターンを使用する必要があると書かれています...しかし、それをどのように行うのかがはっきりとわかりません。

4

1 に答える 1

2

ユーザーのタイプごとに異なるベースコントローラーを作成すると、そのステートメントを1回設定するだけで済みます。ユーザーコントローラーは次のようになります。

<?PHP
class User_Controller extends MY_Controller
{
function __construct()
{
    parent::__construct();      
    if (!$this->session->userdata('is_logged_in')) {
        $this->session->set_flashdata('message', "I'm sorry, but you must  be logged in to view that page.");
        redirect("/");
    }
}
}

次に、ログインしたばかりのユーザーがアクセスするコントローラーは、User_Controllerを自動的に拡張し、ログインしている場合にのみ機能が使用できるようにします。拡張できるようにするには、これをコアフォルダーに保存する必要があります。

また、これをconfig.phpに追加して、MY_以外のプレフィックスを持つベースコントローラーを作成する必要があります。

function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
    @include_once( APPPATH . 'core/'. $class . EXT );
}
}
于 2012-10-13T04:15:05.377 に答える