2010-09-09 7 views
33

Tôi có phiên tin này trong một trong các bộ điều khiển của tôi để kiểm tra nếu người dùng đang đăng nhập:séc CodeIgniter cho phiên người dùng trong mỗi bộ điều khiển

function _is_logged_in() { 

    $user = $this->session->userdata('user_data'); 

    if (!isset($user)) { 
     return false; 
    } 
    else { 
     return true; 
    } 

} 

Vấn đề là tôi có nhiều hơn một Controller. Làm thế nào tôi có thể sử dụng chức năng này trong các bộ điều khiển khác? Xác định lại chức năng trong mọi Bộ điều khiển không phải là rất 'DRY'.

Bất kỳ ý tưởng nào?

Trả lời

51

Một lựa chọn khác là tạo ra bộ điều khiển cơ sở. Đặt chức năng trong bộ điều khiển cơ sở và sau đó kế thừa từ điều này.

Để đạt được điều này trong CodeIgniter, hãy tạo một tệp có tên MY_Controller.php trong thư mục thư viện của ứng dụng của bạn.

class MY_Controller extends Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function is_logged_in() 
    { 
     $user = $this->session->userdata('user_data'); 
     return isset($user); 
    } 
} 

Sau đó, làm cho bộ điều khiển của bạn kế thừa từ bộ điều khiển cơ sở này.

class X extends MY_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function do_something() 
    { 
     if ($this->is_logged_in()) 
     { 
      // User is logged in. Do something. 
     } 
    } 
} 
+0

Không nghĩ về điều đó, tôi thực sự thích ý tưởng đó. Tôi nghĩ rằng nó thực tế hơn một chút so với sử dụng một người trợ giúp. – networkprofile

+1

Bộ điều khiển của tôi không bị phát hiện, tôi nhận được lỗi này: Lỗi nghiêm trọng: Lớp 'MY_Controller' không tìm thấy trong C: \ xampplite \ htdocs \ mobilehome \ application \ controllers \ links.php trên dòng 3 ....... ..... bất kỳ ý tưởng làm thế nào tôi có thể autoload nó ở đâu đó? Hoặc tôi nên chỉ bao gồm nó trên đầu trang của mỗi bộ điều khiển? – networkprofile

+3

Tôi nghĩ rằng các bộ điều khiển cần các nhà thầu. 'function __construct() {parent :: __ construct();}' –

32

Đặt trong trình trợ giúp và tự động tải.

người giúp đỡ/login_helper.php:

function is_logged_in() { 
    // Get current CodeIgniter instance 
    $CI =& get_instance(); 
    // We need to use $CI->session instead of $this->session 
    $user = $CI->session->userdata('user_data'); 
    if (!isset($user)) { return false; } else { return true; } 
} 

config/autoload.php:

$autoload['helper'] = array('login'); 

Sau đó, trong bộ điều khiển của bạn, bạn có thể gọi:

is_logged_in(); 
+0

làm thế nào để tôi gọi là lớp phiên từ bên ngoài một lớp học? Tôi nhận được lỗi này với mã của bạn: Lỗi nghiêm trọng: Sử dụng $ this khi không có trong bối cảnh đối tượng trong C: \ xampplite \ htdocs \ mobilehome \ application \ helpers \ login_helper.php trên dòng 4 ... cảm ơn! – networkprofile

+2

Bạn không sử dụng '$ this' trong trình trợ giúp. Vui lòng xem lại mã trong câu trả lời. Trong các trình trợ giúp (và các thư viện), để sử dụng các hàm CodeIgniter, bạn cần lấy cá thể CodeIgniter. '$ CI = & get_instance();' thực hiện điều này. Thay vì sử dụng '$ this', sử dụng' $ CI'. –

+0

Tôi hiểu, cảm ơn lần nữa! – networkprofile

3

Lấy dữ liệu của tất cả người dùng từ phiên.

Trong khiển,

$userData = $this->session->all_userdata(); 

Trong Xem,

print_r($userData); 
5

Bạn có thể đạt được điều này sử dụng helper và CodeIgniter constructor.

  1. Bạn có thể tạo my_helper.php helper tùy chỉnh trong đó viết hàm của bạn

    function is_logged_in() { 
        $user = $this->session->userdata('user_data'); 
        if (!isset($user)) { 
        return false; 
        } 
    else { 
        return true; 
    } 
    } 
    
  2. Trong điều khiển nếu login.php của nó

    class Login extends CI_Controller { 
    
        public function __construct() 
        { 
         parent::__construct(); 
         if(!is_logged_in()) // if you add in constructor no need write each function in above controller. 
         { 
         //redirect you login view 
         } 
        } 
    
2

Tôi nghĩ rằng sử dụng lưỡi câu được khá dễ. Chỉ cần tạo một cái móc để kiểm tra $this->session->user. Nó sẽ được gọi trong mọi yêu cầu.

1

Chỉ cần thêm này vào thư mục tập tin lõi ci_controller tại function __construct() để kiểm tra tất cả các bộ điều khiển():

function __construct() 
{ 
    parent::__construct(); 
    if(! $user = $this->session->userdata('user_data');) 
    { 
     return false; 
    } 
}