2017-02-23 1 views
0

J'ai un contrôleur comme admin et un autre comme guest. Je veux avoir des http demandes à une adresse statique comme test.com/guest/index, et ont ce résultat:Yii2 - transmettre une requête à un contrôleur en fonction des types d'utilisateur

si l'utilisateur (déterminé dans le corps de la demande en tant que username) est un admin (en fait not-guest) utilisateur, il doit le port de la demande (pas rediriger, car la redirection ne peut pas être fait dans un api-client, et bien sûr la requête http ne peut pas se déplacer le long des méthodes sur la redirection) vers une méthode spécifique du contrôleur admin.

comme j'envoyer une demande POST-test.com/guest/index et je suis admin devrait donc tourner la methodName() - je spécifier le nom pas la demande - de admin contrôleur et si quelqu'un d'autre qui n'est pas admin envoyer la même demande il courrais methodName() (même nom de méthode) du contrôleur guest.

comment cela peut-il être fait? J'utilise Yii2. donc je veux savoir est-il un moyen de le faire ou s'il n'y a aucun moyen est-il possible dans un seul contrôleur avec des noms de méthodes différentes? est-il possible dans l'extension ACL? grâce

Répondre

1

Je suggère la création de contrôleur unique nommé GuestController et demande de traitement ne repose pas sur les informations envoyées, mais sur le statut de l'utilisateur actuel:

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

grâce ceci semble une bonne approche, mais comment dois-je set \ Yii :: $ app-> user-> partie rôle? parce qu'il n'y a pas de fonctionnalité de connexion basée uniquement sur le corps de la requête et le nom d'utilisateur, où dois-je le configurer? –

+0

Eh bien, si vous ne permettez pas aux utilisateurs de se connecter, je ne pense pas qu'il devrait y avoir un traitement de la fonction d'administration. Je peux transmettre n'importe quelle information à votre formulaire - nom d'utilisateur aussi. – Justinas

+0

en fait nom d'utilisateur et mot de passe enverra le long de la demande. Je devrais les valider et si c'était un admin alors faites methodAdmin() et sinon faites methodGuest(). donc dans chaque demande, il devrait faire le login lui-même il n'y a pas de session ou cookie ou d'autres choses. Est-ce qu'il y a un moyen de faire ça? –