2017-02-23 61 views
0

我的控制器爲admin,另一個爲guest。 我希望有一些http要求像test.com/guest/index靜態地址,並有這樣的結果:Yii2 - 根據用戶類型向控制器發送請求

如果用戶(在請求主體確定爲username)是admin(實際上not-guest)用戶,那麼它應該端口的請求(不重定向,因爲重定向不能在api-client中完成,當然http請求不能沿着重定向方法移動)到admin控制器的特定方法。

像我發送一個POST請求test.com/guest/index,我admin所以它應該運行methodName() - 我應該指定名稱不是要求 - 從admin控制器,如果別人誰不是admin發送相同的請求,它應該運行methodName()(方法名稱相同)從guest控制器。

這怎麼辦?我使用Yii2。所以我想知道有沒有辦法做到這一點,或者如果沒有辦法,那麼可能在一個單一的控制器使用不同的方法名稱? 它可能在ACL擴展? 感謝

回答

1

我建議創建一個名爲GuestController和工藝的要求不是基於發送的信息單一控制器,但是當前用戶狀態:

class GuestController extends yii\web\Controller { 
    public function actionIndex() { 
     $response = null; 

     $model = User::getByCredentials(); 

     if (!$model) { 
      $response = $this->guestAction(); 
     } else { 

      switch ($model->role) { 
      case 'admin': 
       $response = $this->adminAction(); 
       break; 
      case 'user': 
       $response = $this->someUserAction(); 
       break; 
      } 
     } 

     echo $response; 
    } 

    protected function adminAction() { 
     $data = \Yii::$app->request->post(); // still can access _POST/_GET... 

     return 'Hallo Warold!'; 
    } 

    /* ... */ 
} 

/** 
* 
*/ 
class User extends yii\web\ActiveRecord { 
    public funcion getByCredentials($username, $password) { 
     $model = self::findOne(['username' => $username]); 

     if (!empty($model) && \Yii::$app->security->validatePassword($password, $model->password)) { 
      return $model; 
     } 

     return null; 
    } 
} 
+0

感謝這個看起來不錯的方法,但是我應該如何設置\ Yii :: $ app-> user->角色部分?因爲根據請求正文和用戶名沒有登錄功能,我應該在哪裏配置它? –

+0

那麼,如果你不允許用戶登錄,比我不認爲應該有處理管理功能。我可以將任何信息傳遞給您的表單 - 用戶名也是如此。 – Justinas

+0

實際上,用戶名和密碼將根據請求發送。我應該驗證它們,如果它是一個管理員,然後做methodAdmin(),如果不是methodGuest()。所以在每個請求中它都應該做自己的登錄,沒有會話或者cookie或者其他的東西。有沒有辦法做到這一點? –