web-dev-qa-db-fra.com

Exécuter mon code avant toute action d'un contrôleur

J'aimerais vérifier si mon utilisateur a rempli certains champs de son profil avant de pouvoir accéder à une action de n'importe quel contrôleur. Par exemple

if(empty(field1) && empty(field2))
{
   header("Location:/site/error")
}

Dans yii1, je pouvais le faire dans protected\components\Controller.php dans la fonction init () Mais dans yii2, je ne sais pas où mettre mon code. Je ne peux pas modifier les fichiers de base, mais je ne sais pas quoi faire en arrière-plan de mon application avancée pour la faire fonctionner.

Je sais que je peux utiliser before avant Action () mais j'ai trop de contrôleurs pour le faire et pour garder une trace de chaque contrôleur

29
Misko Mali

Si vous devez exécuter un code avant chaque contrôleur et chaque action, procédez comme suit:

1 - Ajoutez un composant dans votre répertoire de composants, par exemple (MyGlobalClass):

namespace app\components;
class MyGlobalClass extends \yii\base\Component{
    public function init() {
        echo "Hi";
        parent::init();
    }
}

2 - Ajoutez le composant MyGlobalClass à votre tableau de composants dans le fichier de configuration:

'components' => [
    'MyGlobalClass'=>[
        'class'=>'app\components\MyGlobalClass'
     ],
     //other components

3 - Ajouter MyGlobalClass dans le tableau bootstarp du fichier de configuration:

'bootstrap' => ['log','MyGlobalClass'],

Maintenant, vous pouvez voir Hi avant chaque action.

Notez que si vous n'avez pas besoin d'utiliser Events et Behaviors, vous pouvez utiliser \yii\base\Object au lieu de \yii\base\Component

48
Ali MasudianPour

Créer un nouveau contrôleur

namespace backend\components;
class Controller extends \yii\web\Controller {
    public function beforeAction($event)
    {
        ..............
        return parent::beforeAction($event);
    }
}

Tous vos contrôleurs doivent maintenant étendre le backend\components\Controller et non pas\yii\web\Controller. avec cela, vous devez modifier chaque contrôleur. J'irais pour cette solution.

Je pense que vous pouvez également remplacer une classe par une autre (donc, aucun changement de contrôleur n’est nécessaire), comme par exemple 

\Yii::$classMap = array_merge(\Yii::$classMap,[
                '\yii\web\Controller'=>'backend\components\Controller',
            ]);

Voir plus de détails ici: http://www.yiiframework.com/doc-2.0/guide-tutorial-yii-integration.html et j'ai pris le code ici: https://github.com/ mithun12000/adminUI/blob/master/src/AdminUiBootstrap.php

vous pouvez mettre cela dans votre fichier index.php. Cependant, assurez-vous de documenter ce changement très bien car quelqu'un qui viendra essayer de déboguer votre code sera totalement dérouté.

21
Mihai P.

Ajoutez simplement un fichier de configuration dans le tableau $ config:

    'on beforeAction' => function ($event) {
           echo "Hello";
    },
21
Ruslan Novikov

Ou, https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md utilisez RBAC pour restreindre l'accès aux actions des contrôleurs une par une en fonction de règles. Pourquoi voudriez-vous restreindre l'accès aux actions du contrôleur en fonction des champs d'utilisateur me dépasse. Vous ne pourrez accéder à rien (y compris au formulaire de connexion) si vous y mettez une restriction.

0
Mihai P.

Je pense que ce code sur le fichier de configuration peut vous aider:

'on beforeAction' => function ($event) {
      // To log all request information
},
'components' => [
    'response' => [
        'on beforeSend' => function($event) {
            // To log all response information
        },
    ],
];
0
Sajjad Dehghani