Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen für EVENT-Ereignisse in Yii2

Detaillierte Erläuterung von Beispielen für EVENT-Ereignisse in Yii2

黄舟
黄舟Original
2017-08-13 09:08:381884Durchsuche

Einführung in Ereignisse

Mithilfe von Ereignissen können Sie die Ausführung eines voreingestellten Codeabschnitts zu einem bestimmten Zeitpunkt auslösen. Ereignisse sind nicht nur eine Möglichkeit, Code zu entkoppeln, sondern auch eine Möglichkeit der Gestaltung von Geschäftsprozessen. In moderner Software gibt es überall Ereignisse. Wenn Sie beispielsweise ein Weibo veröffentlichen, wird ein Ereignis ausgelöst, das dazu führt, dass Personen, die Ihnen folgen, Ihre neuen Inhalte sehen. Bei Veranstaltungen gibt es mehrere Elemente:

  • Was ist das für eine Veranstaltung? In einem Softwaresystem gibt es viele Ereignisse. Das Veröffentlichen eines neuen Weibo ist ein Ereignis, und das Löschen eines Weibo ist ebenfalls ein Ereignis.

  • Wer hat das Ereignis ausgelöst? Was Sie auf Weibo posten, ist das Ereignis, das Sie auslösen.

  • Wer ist für die Überwachung dieses Ereignisses verantwortlich? Oder wer weiß, dass dieses Ereignis passiert ist? Das Modul auf dem Server, das die Benutzerregistrierung verwaltet, wird Ihr neues Weibo-Event definitiv nicht empfangen. Wie gehe ich mit dem

  • -Ereignis um? Für den Fall, dass ein neues Weibo veröffentlicht wird, dient dies dazu, andere Benutzer zu benachrichtigen, die Ihnen folgen.

  • Was sind die ereignisbezogenen Daten? Für die Veröffentlichung eines neuen Weibo-Ereignisses müssen die enthaltenen Daten mindestens den Inhalt des neuen Weibo, die Uhrzeit usw. umfassen.

Code-Implementierung

Bindung auf Objektebene

Falleinführung: Da ist eine Katze, und die Maus rennt weg, wenn sie bellt
Um diesen Fall umzusetzen, erstellen wir den Ereignisordner im frontend
-Ordner Es gibt 2 Klassendateien im 🎜>Ereignisordner , eine Cat-Klasse und eine Mouse-Klasse

<?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;);
    }
}
Mouse. php

<?php

namespace frontend\event;

/**
 * 老鼠类
 * Class: \frontend\event\Mouse
 */
class Mouse
{
    public function run()
    {
        echo &#39;老鼠:有猫来了,赶紧跑啊~~<br />&#39;;
    }
}
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();
    }
}
Geben Sie http://yourdomain.com/?r=event/test

in den Browser ein, um

durch Anrufen der Katze Die Shout-Methode löst das Miao-Ereignis aus und die Maus rennt weg
猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~

Plötzlich, eines Tages, schließt sich der Hund diesem Fall an. Solange die Katze bellt, geht der Hund zur Katze

so steht es auch im Event-Ordner

Hundemitglied Dog.php hinzufügen

Frontend/controllers/EventController.php ändern
<?php

namespace frontend\event;

/**
 * Class \frontend\event\Dog
 */
class Dog extends \yii\base\Component
{
    /**
     * 找猫
     */
    public function findCat()
    {
        echo &#39;狗:wang wang wang, 猫在哪里??&#39;;
    }
}
Hund sucht Katze-Event hinzufügen


http im Browser aktualisieren ://yourdomain.com/?r=event/test
...
// 需事先给猫绑定 miao 事件才可以触发此事件
// 猫一叫,就触发老鼠的 run 方法
$cat->on(&#39;miao&#39;, [$mouse, &#39;run&#39;]);
$cat->on(&#39;miao&#39;, [$dog, &#39;findCat&#39;]); // 添加狗找猫事件

// 让猫发出叫声
$cat->shout();
...
Get


Plötzlich langweilte sich der Hund und wollte nicht zum Katze mehr, also bellte er, was immer er wollte
猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
狗:wang wang wang, 猫在哪里??
Dann müssen wir nur noch den Hund losbinden, der nach dem Katzenereignis sucht

frontend/controllers/EventController.php ändern

So das Endergebnis wird natürlich das Geräusch des Hundes fehlen
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();
}
...

Bindung auf Klassenebene

Aber es gibt ein Problem. Das obige Ereignis richtet sich an das von

$cat

zugewiesene Objekt, das heißt, fügen Sie am Ende der actionTest-Methode in frontend/controllers/EventController.php hinzu (new Cat())->shout();
löst das Miao-Ereignis nicht aus

Grund:
public function actionTest()
{
    ... 

    // 让猫发出叫声
    $cat->shout(); // 会触发 miao 事件
    (new Cat())->shout(); // 不会触发 miao 事件
}
Sind alle Ereignisse durch das $cat-Objekt gebunden

Gibt es eine Möglichkeit, dass Mäuse weglaufen, solange das Geräusch von einer Katze erzeugt wird? ? Dies erfordert die Verwendung von
Ereignisbindung auf Klassenebene

Ereignisbindung auf Klassenebene erfordert die Verwendung der yiibaseEvent-Klasse

Frontend/Controller ändern / EventController.php

Aktualisieren Sie die Seite und erhalten Sie
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 事件
}

Zusammenfassung
猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~

    Ereignisbindungsklassifizierung auf Objektebene und Klassenebenenbindung
  • Objektebene gilt nur für ein bestimmtes instanziiertes Objekt
  • Klassenebene gilt für alle instanziierten Objekte
  • Sollten im obigen Verständnis Fehler enthalten sein, können Sie diese gerne ansprechen und korrigieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für EVENT-Ereignisse in Yii2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn