web-dev-qa-db-fra.com

Obtenir le contrôleur actuel et l'identifiant d'action dans Yii

Je souhaite obliger tous les utilisateurs à se connecter avant d'accéder aux pages de mon site. J'ai suivi le tutoriel de Larry Ullman Forçage de la connexion pour toutes les pages dans Yii .

Selon le didacticiel, vous pouvez créer une exception pour certaines pages afin d'éviter de rediriger vers la page de connexion. Afin de vérifier le contrôleur actuel, il a vérifié la valeur $_GET. Mon problème est que j'ai utilisé urlManager pour réécrire l'URL et que $_GET me donne une valeur nulle. Existe-t-il une méthode que je peux utiliser pour obtenir le contrôleur et l'action actuels dans la partition de ma classe?

J'ai essayé ce qui suit mais il n'est pas accessible dans le cadre de ma classe de composants:

Yii::app()->controller->getId
30
Hamid Ghorashi

Oui, vous pouvez obtenir la route actuelle controller/action en inversant la règle urlManager:

Yii::app()->urlManager->parseUrl(Yii::app()->request)
45
eXtreme

As-tu essayé:

Yii::app()->controller->id

et:

Yii::app()->controller->action->id

?

44
Korcholis

Comme maintenant dans Yii2

obtenir le controller name actuel

Yii::$app->controller->id

controller object actuel

Yii::$app->controller

action name actuel:

Yii::$app->controller->action->id

route actuel:

Yii::$app->requestedRoute
16
Kuldeep Dangi

Avec Yii2, obtenez l’objet contrôleur actuel avec:

Yii::$app->controller

A partir du contrôleur, obtenez l'action en cours sous forme de chaîne en utilisant:

Yii::$app->controller->action->id
11
Marco Moreno

En Yii2:

Le problème lié à l'appel de Yii::$app->controller->id est que, lorsque vous l'appelez quelque part (exemple: dans l'un de vos contrôleurs abstraits de niveau supérieur), Yii::$app->controller peut ne pas être instancié pour le moment.

Appelez simplement urlManager pour mapper la demande afin d’acheminer:

var_dump(Yii::$app->urlManager->parseRequest(Yii::$app->request))
8
Jinsong Li

Si je pose correctement votre question, vous essayez en principe d’arrêter l’accès à certaines actions du contrôleur sans y être connecté, non?

Si c'est ce que vous recherchez, la méthode correcte pour le faire est la suivante: 

  1. Créez une actionMethod() dans le contrôleur comme suit: 

    class SomeController extends CController{
    
      public function actionSomeAction(){
    
        ... More code...
    
    }
    
  2. Après cela, vous pouvez accéder au site en utilisant: chemin/vers/application/controllerName/actionName

  3. Maintenant, si vous voulez forcer l'utilisateur à se connecter avant d'accéder à l'action, procédez comme suit:

Faites un contrôle d'accès comme suit: 

 /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

/**
 * Specifies the access control rules.
 * This method is used by the 'accessControl' filter.
 * @return array access control rules
 */
public function accessRules()
{
    return array(

        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions' => array('**yourActionMethodName**'),
            'users' => array('@'),
        ),

        array('deny', // deny all users
            'users' => array('*'),
        ),
    );
}

Désormais, seuls les utilisateurs authentifiés pourraient accéder à l'URL.

J'espère que cela a résolu votre problème.

If you simply want to check if the user is a guest and if he is, send him to the login page everytime:

Dans config/main.php, ajoutez ce qui suit:

'defaultController' => 'controllerName/actionMethod',

Et dans ce contrôleur, ajoutez simplement la règle d'accès ci-dessus. Maintenant, par défaut, vous ouvrez le site avec une méthode de contrôle d’accès. Donc, cela vous redirigerait automatiquement vers la page de connexion.

Even another method:

Il suffit d’ajouter ceci dans views/layouts/main.php 

<?php 

if(Yii::app()->user->isGuest)
{ 
   $this->redirect('/site/login');
}
?>
4
Sankalp Singha

Essayez Yii::app()->controller->getRoute()

3
CreatoR
if (Yii::$app->requestedAction->id == "index") {
    //do something
}
0
sergey