web-dev-qa-db-fra.com

Comment utiliser les événements dans yii2?

J'ai parcouru la documentation et tous les articles sur Yii2 events trouvé à l'aide de Google. Quelqu'un peut-il me donner un bon exemple de la façon dont les événements peuvent être utilisés dans Yii2 et où cela peut sembler logique?

31
nirajan poudel

Je peux expliquer les événements par un exemple simple. Disons que vous voulez faire peu de choses lorsqu'un utilisateur s'inscrit pour la première fois sur le site comme:

  1. Envoyez un e-mail à l'administrateur.
  2. Créez une notification.
  3. vous l'appelez.

Vous pouvez essayer d'appeler quelques méthodes une fois qu'un objet utilisateur a été enregistré avec succès. Peut-être comme ça:

if($model->save()){
   $mailObj->sendNewUserMail($model);
   $notification->setNotification($model);
}

Jusqu'à présent, cela peut sembler correct, mais que se passe-t-il si le nombre d'exigences augmente avec le temps? Dire que 10 choses doivent se produire après qu'un utilisateur s'est enregistré? Les événements sont utiles dans des situations comme celle-ci.

Bases des événements

Les événements sont composés du cycle suivant.

  1. Vous définissez un événement. Dites, enregistrement d'un nouvel utilisateur.
  2. Vous le nommez dans votre modèle. Peut-être en ajoutant une constante dans le modèle User. Comme const EVENT_NEW_USER='new_user';. Ceci est utilisé pour ajouter des gestionnaires et déclencher un événement.
  3. Vous définissez une méthode qui doit faire quelque chose lorsqu'un événement se produit. Envoi d'un e-mail à l'administrateur par exemple. Il doit avoir un paramètre $event. Nous appelons cette méthode un gestionnaire.
  4. Vous attachez ce gestionnaire au model à l'aide de sa méthode appelée on(). Vous pouvez appeler cette méthode autant de fois que vous le souhaitez - vous pouvez simplement attacher plusieurs gestionnaires à un même événement.
  5. Vous déclenchez l'événement en utilisant trigger().

Notez que toutes les méthodes mentionnées ci-dessus font partie de la classe Component. Presque toutes les classes de Yii2 ont hérité de cette classe. Oui ActiveRecord aussi.

codons

Pour résoudre le problème mentionné ci-dessus, nous pouvons avoir le modèle User.php. Je n'écrirai pas tout le code ici.

// in User.php i've declared constant that stores event name
const EVENT_NEW_USER = 'new-user';

// say, whenever new user registers, below method will send an email.
public function sendMail($event){
   echo 'mail sent to admin';
   // you code 
}

// one more hanlder.

public function notification($event){
  echo 'notification created';
}

Une chose à retenir ici est que vous n'êtes pas obligé de créer des méthodes dans la classe qui crée un événement. Vous pouvez ajouter n'importe quelle méthode statique et non statique de n'importe quelle classe.

J'ai besoin d'attacher les gestionnaires ci-dessus à l'événement. La manière de base que j'ai faite est d'utiliser la méthode init() d'AR. Voici donc comment:

// this should be inside User.php class.
public function init(){

  $this->on(self::EVENT_NEW_USER, [$this, 'sendMail']);
  $this->on(self::EVENT_NEW_USER, [$this, 'notification']);

  // first parameter is the name of the event and second is the handler. 
  // For handlers I use methods sendMail and notification
  // from $this class.
  parent::init(); // DON'T Forget to call the parent method.
}

La dernière chose est de déclencher un événement. Maintenant, vous n'avez pas besoin d'appeler explicitement toutes les méthodes requises comme nous l'avons fait auparavant. Vous pouvez le remplacer en suivant:

if($model->save()){
  $model->trigger(User::EVENT_NEW_USER); 
}

Tous les gestionnaires seront automatiquement appelés.

76
Ejaz Karim

Pour les événements "mondiaux".

En option, vous pouvez créer une classe d'événements spécialisée

namespace  your\handler\Event\Namespace;
class EventUser extends Event {
   const EVENT_NEW_USER = 'new-user';
}

définir au moins une classe de gestionnaire:

namespace  your\handler\Event\Namespace;
class handlerClass{
    // public AND static
    public static function handleNewUser(EventUser $event)
    {
        // $event->user contain the "input" object
        echo 'mail sent to admin for'. $event->user->username;
    }
}

À l'intérieur de la partie composant de la configuration sous (dans ce cas) le composant utilisateur insère votre événement:

'components' => [
  'user' => [
    ...
    'on new-user' => ['your\handler\Event\Namespace\handlerClass', 'handleNewUser'],
  ],
  ...
]

Ensuite, dans votre code, vous pouvez déclencher l'événement:

Yii::$app->user->trigger(EventUser::EVENT_NEW_USER, new EventUser($user));

AJOUTEZ

Vous pouvez également utiliser une fermeture:

  • permet IDE de "détecter" l'utilisation de la fonction (pour la navigation dans le code)
  • mettre un (petit) code qui gère l'événement

exemple:

'components' => [
  'user' => [
    ...
    'on new-user' => function($param){ your\handler\Event\Namespace\handlerClass::handleNewUser($param);},
    'on increment' => function($param){ \Yii::$app->count += $param->value;},
  ],   
  ... 
]
23
Ivan Buttinoni

Par défaut, Yii2 fournit déjà une déclaration d'événement. Vous pouvez en savoir plus sur les explications sur BaseActiveRecord .

Vous pouvez utiliser cette variable de la même manière que la déclarer manuellement.

public function init()
{
    parent::init();

    $this->on(self::EVENT_AFTER_INSERT, [$this, 'exampleMethodHere']);
}
3
elfarqy