Explication détaillée d'exemples d'événements EVENT dans Yii2

黄舟
Libérer: 2023-03-14 22:32:01
original
1872 Les gens l'ont consulté

Introduction aux événements

À l'aide d'événements, vous pouvez déclencher l'exécution d'un morceau de code prédéfini à un moment précis. Les événements ne sont pas seulement un moyen de découpler le code, mais aussi un moyen. de conception de processus métier. Dans les logiciels modernes, les événements sont partout. Par exemple, si vous publiez un Weibo, un événement sera déclenché, permettant aux personnes qui vous suivent de voir votre nouveau contenu. Pour les événements, il y a plusieurs éléments :

  • De quel genre d'événement s'agit-il ? Dans un système logiciel, il existe de nombreux événements. La publication d'un nouveau Weibo est un événement, et la suppression d'un Weibo est également un événement.

  • Qui a déclenché l'événement ? Ce que vous publiez sur Weibo est l'événement que vous déclenchez.

  • Qui est responsable du suivi de cet événement ? Ou qui sait si cet événement s'est produit ? Le module sur le serveur qui gère l'enregistrement des utilisateurs ne recevra certainement pas votre nouvel événement Weibo. Comment gérer l'événement

  •  ? En cas de publication d'un nouveau Weibo, il s'agit d'avertir les autres utilisateurs qui vous suivent.

  • Quelles sont les données liées à l'événement ? Pour publier un nouvel événement Weibo, les données incluses doivent au moins inclure le contenu du nouveau Weibo, l'heure, etc.

Implémentation du code

Liaison au niveau de l'objet

Introduction au cas : Il y a un chat, et la souris s'enfuira lorsqu'elle aboie
Afin de mettre en œuvre ce cas, nous créons le dossier d'événements dans le dossier frontend
Il y a 2 fichiers de classe dans le 🎜>dossier d'événements , une classe Cat et une classe Souris

<?php

namespace frontend\event;

/**
 * 猫类
 * Class: \frontend\event\Cat
 * 
 * 为了让猫具有事件能力
 * 所以要继承 \yii\base\Component
 * >>> \yii\base\Component 对 \yii\base\Event 的 on 方法进行重写
 * >>> \yii\base\Event 适合类级绑定
 * >>> \yii\base\Component 适合对象级绑定
 */
class Cat extends \yii\base\Component
{
    /**
     * 猫发出叫声
     */
    public function shout()
    {
        echo &#39;猫:miao miao miao <br />&#39;;
        
        // 猫叫了之后 触发猫的 miao 事件
        $this->trigger(&#39;miao&#39;);
    }
}
Copier après la connexion
Souris. php

<?php

namespace frontend\event;

/**
 * 老鼠类
 * Class: \frontend\event\Mouse
 */
class Mouse
{
    public function run()
    {
        echo &#39;老鼠:有猫来了,赶紧跑啊~~<br />&#39;;
    }
}
Copier après la connexion
EventController.php

<?php

namespace frontend\controllers;

use frontend\event\Cat;
use frontend\event\Mouse;

/**
* Class: \frontend\controllers\Event
*/
class EventController extends \yii\web\Controller
{
    public function actionTest()
    {
        $cat = new Cat();
        $mouse = new Mouse();

        // 需事先给猫绑定 miao 事件才可以触发此事件
        // 猫一叫,就触发老鼠的 run 方法
        $cat->on(&#39;miao&#39;, [$mouse, &#39;run&#39;]);

        // 猫发出叫声
        $cat->shout();
    }
}
Copier après la connexion
Entrez http://votredomaine.com/?r=event/test

dans le navigateur pour obtenir

猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
Copier après la connexion
en appelant cat La méthode scream déclenche l'événement miao, et la souris s'enfuit

Soudain, un jour, le chien rejoint cette affaire, et tant que le chat aboie, le chien ira vers le chat

est donc également dans le dossier de l'événement
Ajouter un membre chien Dog.php

<?php

namespace frontend\event;

/**
 * Class \frontend\event\Dog
 */
class Dog extends \yii\base\Component
{
    /**
     * 找猫
     */
    public function findCat()
    {
        echo &#39;狗:wang wang wang, 猫在哪里??&#39;;
    }
}
Copier après la connexion
Modifier frontend/controllers/EventController.php

Ajouter un chien recherchant un événement chat

...
// 需事先给猫绑定 miao 事件才可以触发此事件
// 猫一叫,就触发老鼠的 run 方法
$cat->on(&#39;miao&#39;, [$mouse, &#39;run&#39;]);
$cat->on(&#39;miao&#39;, [$dog, &#39;findCat&#39;]); // 添加狗找猫事件

// 让猫发出叫声
$cat->shout();
...
Copier après la connexion
Actualiser http dans le navigateur ://votredomaine.com/?r=event/test

Obtenir

猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
狗:wang wang wang, 猫在哪里??
Copier après la connexion
Soudain, le chien s'est ennuyé et n'a plus voulu y aller au chat, alors il a aboyé ce qu'il voulait

Ensuite, nous avons juste besoin de dissocier le chien à la recherche d'un événement de chat
Modifier frontend/controllers/EventController.php

use frontend\event\Cat;
use frontend\event\Mouse;
use frontend\event\Dog;
...
public function actionTest()
{
    $cat = new Cat();
    $mouse = new Mouse();
    $dog = new Dog();

    // 需事先给猫绑定 miao 事件才可以触发此事件
    // 猫一叫,就触发老鼠的 run 方法
    $cat->on(&#39;miao&#39;, [$mouse, &#39;run&#39;]);
    $cat->on(&#39;miao&#39;, [$dog, &#39;findCat&#39;]);

    // 并非直接删除 $cat->on(&#39;miao&#39;, [$dog, &#39;findCat&#39;]);
    // 而是通过 off 解除绑定
    $cat->off(&#39;miao&#39;, [$dog, &#39;findCat&#39;]);

    // 让猫发出叫声
    $cat->shout();
}
...
Copier après la connexion
Donc le le résultat final manquera naturellement du son du chien

Liaison au niveau de la classe

Mais il y a un problème. L'événement ci-dessus est dirigé vers l'objet assigné par

$cat, c'est-à-dire, ajoutez
à la fin de la méthode actionTest dans frontend/controllers/EventController.php (new Cat())->shout(); ne déclenchera pas l'événement miao

public function actionTest()
{
    ... 

    // 让猫发出叫声
    $cat->shout(); // 会触发 miao 事件
    (new Cat())->shout(); // 不会触发 miao 事件
}
Copier après la connexion
Raison :

tous les événements sont liés via l'objet $catY a-t-il un moyen pour que les souris s'enfuient tant que le son est émis par un chat ? ?
Cela nécessite l'utilisation d'une
liaison d'événement au niveau de la classe

la liaison d'événement au niveau de la classe nécessite l'utilisation de la classe yiibaseEventmodify frontend/controllers / EventController.php

use frontend\event\Cat;
use frontend\event\Mouse;
use yii\base\Event;
...
public function actionTest()
{
    $cat = new Cat();
    $mouse = new Mouse();

    // 类级别的事件绑定
    // 只要猫发出声音,不管是什么猫,都会触发老鼠的 run 方法
    Event::on(Cat::className() ,&#39;miao&#39;, [$mouse, &#39;run&#39;]);

    // 让猫发出叫声
    $cat->shout(); // 会触发 miao 事件
    (new Cat())->shout(); // 会触发 miao 事件
}
Copier après la connexion
Actualisez la page et obtenez

猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
Copier après la connexion
Résumé

  • Liaison au niveau de l'objet de classification de liaison d'événement et liaison au niveau de la classe

  • Le niveau d'objet s'applique uniquement à un certain objet instancié

  • Le niveau de classe s'applique à tous les objets instanciés

S'il y a des erreurs dans la compréhension ci-dessus, n'hésitez pas à les signaler et à les corriger

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!