2010-12-05 37 views
1

我想使某些操作僅適用於已登錄的用戶。 我試圖限制某些這段代碼:限制一些動作,_remap函數,CodeIgniter

function _remap($method) 
    { 
     $restricted = array('update_rating', 'delete_post'); 
     if(! $this->session->userdata('logged_in') && in_array($method, $restricted)) 
     { 
      echo 'Log in, please'; 
     } 
     else { 
      $this->$method(); 
     } 
    } 

但是這$ - > $()方法,並沒有收到這是在URL中發送的參數。該怎麼辦? 我想僅爲登錄用戶提供一些動作。

+0

`_remap`是一個特殊的函數從URL修改調用函數...如果要限制通過URL訪問功能,則必須追加下劃線`_foo($瓦爾)` - 這可以只能在你的控制器中調用(不通過url)。澄清也許?否則您的代碼看起來不錯。在上面,無論調用什麼函數,`_remap`都會根據您的條件比較請求並嘗試調用它。 – Ross 2010-12-05 19:47:26

+0

不,我想讓一些功能只允許記錄用戶。 – Kir 2010-12-05 20:12:29

回答

2

要限制登錄的用戶爲整個控制器使用類似:

function __construct(){ 

    if(!is_logged_in){ 
    redirect('user/login'); 
    } 

} 

還是做同樣的,如果你需要限制的具體方法:

function restricted_function(){ 

    if(!is_logged_in){ 
    redirect('user/login'); 
    } 

} 

這要求您在調用控制器之前設置了is_logged_in變量。

我使用一個MY_controller來檢查所有控制器繼承的登錄會話。

1

您沒有向它發送任何參數。

您應該提供所有需要$方法進行評估的參數。

function _remap($method) 
{ 
    $restricted = array('update_rating', 'delete_post'); 
    if(! $this->session->userdata('logged_in') && in_array($method, $restricted)) 
    { 
     echo 'Log in, please'; 
    } 
    else 
    { 
     $params = get_func_get_args(); 
     $this->$method($params); 
    } 
} 

請注意,方法現在將接收和參數的數組。

2

理想情況下,您不應該使用這種開發模式來創建用戶登錄。您應該簡單地在您調用的類的構造函數中進行檢查,然後使用$ this-> router->方法來查看用戶嘗試訪問的方法。檢查需要登錄的方法數組,然後檢查用戶是否登錄。如果其中一個條件爲false,則重定向至登錄頁面,否則繼續執行呼叫。示例實現如下:

Class XYZ extends Controller{ 

    function __construct() { 
     parent::controller(); 
     $protected_methods = array('method_1', 'method_2'); 

     if(in_array($this->router->method, $protected_methods)){ 
      // check if user is logged in 
      if(!$this->session->userdata('logged_in')) 
       redirect('/login'); 
     } 
    } 

}