2011-11-24 29 views
7

Hãy nói tại điều khiển của tôi tên là Sách, tôi có nhiều phương pháp, chẳng hạn như get_book();read_book();remove_book();CodeIgniter - Làm thế nào để kiểm tra phiên sẽ được sử dụng ở mọi phương pháp

Không phương thức trong lớp có thể được sử dụng mà không cần người dùng đã đăng nhập và tôi có thể nhận được user_id từ phiên.

Câu hỏi của tôi là, các cách nào là tốt nhất để kiểm tra xem phiên user_id có được đặt để tôi có thể sử dụng các phương pháp không?

Như bây giờ tôi đang nghĩ đến việc tạo ra một phương pháp is_logged_in(), và áp dụng nó vào mỗi phương pháp với một tuyên bố if-else, như

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

Không phải là nó dài và tẻ nhạt? Có cách nào cuối cùng để đạt được điều này?

Tôi đọc vào liên kết

codeigniter check for user session in every controller

Nhưng dường như tôi vẫn phải áp dụng việc kiểm tra is_logged_in ở mọi phương pháp.

Cảm ơn bạn đã giúp tôi!

Trả lời

11

Tạo một tập tin gọi MY_controller.php (tiền tố có thể được chỉnh sửa trong file config) trong /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 
    } 

} 

Sau đó, bất cứ khi nào bạn tạo bộ điều khiển mới, bạn quyết định truy cập nào yêu cầu phải có

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

Điều này cắt mã trùng lặp rất nhiều, vì nếu bạn cần một bộ điều khiển thành viên khác ngoài Book bạn chỉ có thể mở rộng Member_Controller. Thay vì phải làm kiểm tra trong tất cả chúng.

+0

Tôi hiểu câu trả lời của bạn, điều này thực sự tuân theo DRY và giúp tôi áp dụng đúng quy tắc kinh doanh cho nhóm người dùng khác nhau. Cảm ơn bạn và @Kemal Kernal rất nhiều vì sự giúp đỡ của bạn :) – user826224

9

Bạn không nhất thiết phải thực hiện việc đó. Chỉ cần đặt mã kiểm tra đăng nhập vào hàm tạo và bạn đã hoàn tất!

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

Cảm ơn bạn rất nhiều, tôi đã thử nghiệm và hoạt động hoàn hảo. Để được cập nhật từ liên kết là chúng ta nên đặt MY_Controller dưới ứng dụng/lõi. Một lần nữa, cảm ơn sự giúp đỡ của bạn :) Chúc một ngày tốt lành! – user826224

+2

@ user826224, bạn vẫn cần phải sao chép mã với điều này. Câu trả lời của tôi khác rất nhiều so với câu trả lời của bạn, bạn nên đọc kỹ :) – Esailija

0

Bạn có thể sử dụng phương pháp này trong constructor của bộ điều khiển, như:

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

Các vấn đề liên quan