Yii2のEVENTイベントの例を詳しく解説

黄舟
リリース: 2023-03-14 22:32:01
オリジナル
1892 人が閲覧しました

イベントの概要

イベントを使用すると、特定の時点で事前に設定されたコードの実行をトリガーできます。イベントはコードを分離する方法であるだけでなく、ビジネス プロセスを設計するためのパターンでもあります。最新のソフトウェアでは、イベントがいたるところにあります。たとえば、Weibo を投稿するとイベントがトリガーされ、あなたをフォローしている人があなたの新しいコンテンツを閲覧するようになります。イベントにはいくつかの要素があります:

  • これはどのようなイベントですか?ソフトウェア システムでは、新しい Weibo の公開もイベントであり、Weibo の削除もイベントです。

  • その出来事を引き起こしたのは誰ですか?あなたが Weibo に投稿する内容が、あなたが引き起こすイベントです。

  • このイベントの監視責任者は誰ですか?あるいは、この出来事が起こったかどうかは誰にも分かりません。ユーザー登録を処理するサーバー上のモジュールは、新しい Weibo イベントを受信しません。

  • その事件にどう対処しますか?新しいWeiboを公開するイベントについては、あなたをフォローしている他のユーザーに通知するためです。

  • イベント関連データとは何ですか?新しい Weibo イベントをリリースするには、含まれるデータには少なくとも新しい Weibo の内容、時間などが含まれている必要があります。

コード実装

オブジェクトレベルバインディング

事例紹介: 逃げる猫がいるマウスを呼び出すとすぐに
この例を実装するには、frontend フォルダー内の event フォルダー
event フォルダー を作成します。 event フォルダー には 2 つのクラス ファイルがあり、そのうちの 1 つは です。 Cat クラスと 1 つの

Mouse

クラス

<?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();
    }
}
ログイン後にコピー

ブラウザに http://yourdomain.com/?r=event/test

と入力し、呼び出して

猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
ログイン後にコピー

を取得します猫の叫び方、ミャオイベントが発生し、ネズミが逃げ出す

ある日突然、犬がこの事件に加わり、猫が吠えている限り、犬は猫のところに行きます

ので、イベントフォルダーにもあります

犬のメンバーを追加 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;;
    }
}
ログイン後にコピー

frontend/controllers/EventController.phpを変更

犬猫探しイベントを追加

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

// 让猫发出叫声
$cat->shout();
...
ログイン後にコピー

更新 http://yourdomain.com/?r=event/test

Get

猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
狗:wang wang wang, 猫在哪里??
ログイン後にコピー

突然、犬は退屈して、もう猫を見つけたくなかったので、好きなように吠えました

それで、猫を探している犬のバインドを解除するだけで済みます

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();
}
...
ログイン後にコピー

それで、最後は結果には当然犬の音が欠けています

クラスレベルバインディングしかし問題があります、上記のイベントは
$catによって割り当てられたオブジェクトに対して、add

(new Cat())->shout ();

frontend/controllers/EventController.php の actionTest メソッドの最後にあります。miao イベントはトリガーされません

public function actionTest()
{
    ... 

    // 让猫发出叫声
    $cat->shout(); // 会触发 miao 事件
    (new Cat())->shout(); // 不会触发 miao 事件
}
ログイン後にコピー
理由:
イベントのバインドは $cat オブジェクトを通じて行われます
猫が鳴いている限りネズミは逃げますか? ? これには、

クラスレベルの

イベントバインディングの使用が必要です
クラスレベルのイベントバインディングには、yiibaseEventクラスの使用が必要です

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 事件
}
ログイン後にコピー

ページを更新して、

猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
猫:miao miao miao 
老鼠:有猫来了,赶紧跑啊~~
ログイン後にコピー
    summary
  • を取得します

  • イベントバインディング分類オブジェクトレベルとクラスレベルバインディング
  • オブジェクトレベルは特定のインスタンス化されたオブジェクトに対してのみ有効です
  • クラスレベルはインスタンス化されたすべてのオブジェクトに対して有効です

🎜上記を理解している場合間違いがあれば、お気軽に指摘して修正してください🎜

以上がYii2のEVENTイベントの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート