Yii2의 EVENT 이벤트 예시에 대한 자세한 설명

黄舟
풀어 주다: 2023-03-14 22:32:01
원래의
1823명이 탐색했습니다.

이벤트 소개

이벤트를 사용하면 특정 시점에 미리 설정된 코드 조각이 실행되도록 할 수 있습니다. 이벤트는 코드를 분리하는 방법일 뿐만 아니라 비즈니스 프로세스를 설계하기 위한 패턴이기도 합니다. 최신 소프트웨어에서는 이벤트가 어디에나 있습니다. 예를 들어, 귀하가 Weibo를 게시하면 이벤트가 발생하여 귀하를 팔로우하는 사람들이 귀하의 새 콘텐츠를 보게 됩니다. 이벤트에는 다음과 같은 여러 요소가 있습니다.

  • 이것은 어떤 종류의 이벤트인가요? 소프트웨어 시스템에는 새로운 웨이보를 게시하는 것도 이벤트이고, 웨이보를 삭제하는 것도 이벤트입니다.

  • 이벤트를 일으킨 사람은 누구인가요? 귀하가 Weibo에 게시하는 내용이 귀하가 실행하는 이벤트입니다.

  • 이 이벤트를 모니터링하는 책임은 누구에게 있습니까? 아니면 이런 일이 일어났는지 누가 알겠습니까? 사용자 등록을 처리하는 서버의 모듈은 귀하의 새로운 Weibo 이벤트를 확실히 수신하지 않습니다.

  • 사고 처리 방법은 무엇인가요? 웨이보를 새로 발행하는 경우, 자신을 팔로우하는 다른 사용자들에게 알리기 위한 것입니다.

  • 이벤트 관련 데이터는 무엇인가요? 새로운 웨이보 이벤트를 게시하려면 포함된 데이터에 적어도 새로운 웨이보의 내용, 시간 등이 포함되어야 합니다.

코드 구현

객체 수준 바인딩

사례 소개: 도망갈 고양이가 있습니다. 마우스를 호출하자마자
이 예제를 구현하기 위해 frontend 폴더의 event 폴더
event 폴더를 만듭니다. event 폴더에는 2개의 클래스 파일, 하나는 Cat이 있습니다. 클래스와 하나의

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;;
    }
}
로그인 후 복사

modify 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();
...
로그인 후 복사

Refresh 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 메소드 끝에 있습니다. 미아오 이벤트는 트리거되지 않습니다

public function actionTest()
{
    ... 

    // 让猫发出叫声
    $cat->shout(); // 会触发 miao 事件
    (new Cat())->shout(); // 不会触发 miao 事件
}
로그인 후 복사
이유:
이벤트 바인딩은 $cat 객체를 통해 수행됩니다
마우스가 고양이 소리만 나면 도망가나요? ? 이를 위해서는

클래스 레벨

이벤트 바인딩을 사용해야 합니다.
클래스 레벨 이벤트 바인딩을 위해서는 yiibaseEvent 클래스를 사용해야 합니다.

modify 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!