2011-11-24 14 views
7

powiedzmy w moim kontrolera o nazwie Book, mam wiele metod, takich jak get_book();read_book();remove_book();CodeIgniter - Jak sprawdzić sesja ma być używany w każdych metod

żadnych metod w klasie mogą być używane bez użytkownik zalogowany i mogę uzyskać user_id z sesji.

Moje pytanie brzmi, jakie są/są najlepsze sposoby sprawdzenia, czy sesja user_id jest ustawiona tak, że mogę korzystać z metod?

Jak na razie myślę o tworzeniu is_logged_in() metody i zastosować go do każdej z metod if-else, jak

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

Czy to nie jest długi i nudny? Czy istnieje ostateczny sposób, aby to osiągnąć?

czytam link

codeigniter check for user session in every controller

Ale wydaje się, że wciąż mam zastosować kontrolę is_logged_in w każdych metod.

Dziękuję za pomoc!

Odpowiedz

11

Utwórz plik o nazwie MY_controller.php (prefiks można edytować w pliku konfiguracyjnym) w /application/core:

<?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 
    } 

} 

Następnie, gdy tylko utworzysz nowy kontroler, będziesz decydować, jaki dostęp będzie wymagał.

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(); 
    } 

Powoduje to znaczne zmniejszenie duplikacji kodu, ponieważ jeśli potrzebujesz innego kontrolera członkowskiego niż Book, możesz po prostu rozszerzyć zakres Member_Controller. Zamiast konieczności przeprowadzania kontroli we wszystkich z nich.

+0

Rozumiałem twoją odpowiedź, to jest naprawdę zgodne z DRY i pomaga mi zastosować prawidłową regułę biznesową do różnych grup użytkowników. Dziękuję i @ Kemal Kernal za pomoc :) – user826224

9

Niekoniecznie musisz to robić. Po prostu wpisz kod sprawdzania logowania w konstruktorze i gotowe!

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

Dziękuję bardzo, przetestowałem i działa bezbłędnie. Aby zostać zaktualizowanym z linku, powinniśmy umieścić MY_Controller w aplikacji/core. Jeszcze raz dziękuję za pomoc :) Miłego dnia! – user826224

+2

@ user826224, nadal musisz zduplikować kod za pomocą tego. Moja odpowiedź różni się znacznie od tej, którą łączyłeś, powinieneś ją uważnie przeczytać :) – Esailija

0

Można użyć metody w konstruktorze kontrolera, jak:

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

Powiązane problemy