资讯专栏INFORMATION COLUMN

浅析Yii2.0的事件Event

李义 / 3242人阅读

摘要:全局级别利用实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。类级别通过维护类的属性数组,触发事件时通过类名和事件名称取到当前类以及父类的数据,再通过函数触发。

概念理解:在某一个事件(trigger)发生的时候,触发预先设定(on)的代码,这是代码解耦的一种方式。
事件按照级别分为三类 1. 实例级别

绑定事件、触发事件的类继承的是Component,只在当前示例中运行,不与类的其他实例发生关系,也不与其他类、其他实例发生关系。

代码示例:

data;
        $event->handled = true;
    }
    
    public function sayWorld($event)
    {
        echo $event->data;
    }
}

1.绑定事件:

$event = new EventTest();

$event->on(EventTest::EVENT_SAY_HELLO, [$event, "sayHello"], "Hello!");

$event->on(EventTest::EVENT_SAY_HELLO, [$event, "sayWorld"], "World!");

2.解除事件:

$event->off(EventTest::EVENT_SAY_HELLO, [$event, "sayHello"]);

3.触发事件:

$event->trigger( EventTest::EVENT_SAY_HELLO);
2. 类级别

绑定事件、触发事件的类继承的是Event,类级别事件会被类自身、类的实例、后代类、后代类实例的同一事件所触发,影响范围更大

代码示例:

data;
    }
    
    public function sayWorld($event)
    {
        echo $event->data;
    }
}

1.绑定事件:

$event = new EventTest();

$event->on("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO, [$event, "sayHello"], "Hello!");

$event->on("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO, [$event, "sayWorld"], "World!");

2.解除事件:

$event->off("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO, [$event, "sayWorld"]);
        

3.触发事件:

$event->trigger("commoncomponentsEventTest", EventTest::EVENT_SAY_HELLO);

类级别参数比实例级别多一个参数:类名
注意:
解除事件如果不传 handle,则会解除该事件下的所有 handle。
在其中一个 handle 里面加上 $event->handled = true 也会阻止后续 handle 的触发,如上代码。
3. 全局级别

利用Application实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。在任意需要的时候,都可以触发全局事件,也可以在任意必要的时候绑定,或解除一个事件。

代码示例:

1.绑定事件:
$event = new EventTest();

Yii::$app->on("global_event", [$event, "globalEvent"], "global event");

2.触发事件:
Yii::$app->trigger("global_event");

全局级别实际上也是一个特殊的实例。[注意所谓全局其实作用范围也只是在当前请求的生命周期有效,而非当前会话(简单的说,打开浏览器,访问服务器,直到浏览器关闭,称为一次会话)]
原理

实例级别通过维护Component类的属性 $_events 数组,触发事件时通过[事件名称]取到[当前实例]的handle数据,再通过函数call_user_func触发handle

类级别通过维护Event类的属性 $_events 数组,触发事件时通过[类名和事件名称]取到[当前类以及父类]的handle数据,再通过函数call_user_func触发handle

Component 的 $_event 数据结构示例如下

Array
(
    [say_hello] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => commoncomponentsEventTest Object
                                (
                                    [_events:yiiaseComponent:private] => Array
 *RECURSION*
                                    [_eventWildcards:yiiaseComponent:private] => Array
                                        (
                                        )

                                    [_behaviors:yiiaseComponent:private] => Array
                                        (
                                        )

                                )

                            [1] => say_hello
                        )

                    [1] => Hello!
                )

        )

)
小结

以上总结参考了深入理解Yii2.0,其实以前就看过,但是也只是局限于看过,没有自己跑demo调试、查看源代码,然后就误以为自己明白了,其实过俩天什么都不记得了。所以现在通过写博客来加深自己的理解,这篇博客其实主要讲的还是事件的使用,具体原理一带而过,如果有小伙伴一知半解,可能查看一下源代码[yiiaseComponent yiiaseEvent]你就明白了。由于水平有限,欢迎小伙伴交流和指正。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31545.html

相关文章

  • 浅析Yii2.0属性Property

    摘要:概念理解第一次看深入理解的时候,我也是懵逼的,属性不就是类的属性吗,有什么好说的。属性的实现步骤继承自。声明一个用于保存该属性的私有成员变量。如果只提供了,那么该属性为只读属性,只提供了,则为只写。 概念理解:第一次看深入理解Yii2.0的时候,我也是懵逼的,属性不就是类的属性吗,有什么好说的。后来才知道Yii框架对成员变量和属性做了区分,那类的成员变量和属性到底是什么关系又有什么区别...

    arashicage 评论0 收藏0
  • 浅析Yii2.0行为Behavior

    摘要:概念理解使用行为可以在不修改现有类的情况下,对类的功能进行扩充。最后将行为名称和行为实例放到的属性中,至此,行为的绑定就结束了。不过在解除的时候虽然都是删掉相应的,但是解除行为还需要解除在绑定行为的时候绑定的事件,这点不太一样。 概念理解:使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像...

    legendmohe 评论0 收藏0
  • 浅析React之事件系统(二)

    摘要:因为阻止事件冒泡的行为只能用于合成事件中,没法阻止原生事件的冒泡。同时的创建和冒泡是在原生事件冒泡到最顶层的之后的。浅析之事件系统一 上篇文章中,我们谈到了React事件系统的实现方式,和在React中使用原生事件的方法,那么这篇文章我们来继续分析下,看看React中合成事件和原生事件混用的各种情况。 上一个例子 在上篇文章中,我们举了个例子。为了防止大家不记得,我们来看看那个例子的代...

    villainhr 评论0 收藏0
  • 浅析 JS 中 EventLoop 事件循环(新手向)

    摘要:同时,如果执行的过程中发现其他函数,继续入栈然后执行。上面我们讨论的其实都是同步代码,代码在运行的时候只用调用栈解释就可以了。 序 Event Loop 这个概念相信大家或多或少都了解过,但是有一次被一个小伙伴问到它具体的原理的时候,感觉自己只知道个大概印象,于是计划着写一篇文章,用输出倒逼输入,让自己重新学习这个概念,同时也能帮助更多的人理解它~ 概念 JavaScript 是一门 ...

    chadLi 评论0 收藏0
  • JS事件浅析

    摘要:事件有很多,有我用过的有我没用过的,今天我想分析一番。阻止默认事件,表单提交,标签。触发事件的元素,事件委托会用到。在文本插入文本框之前会触发事件。 一个网页由三层组成(html 结构,js 行为,css 表现),一切的东西其实都建立在html上,html里面的dom提供了一些事件,然后通过js封装,我们可以用js去调用dom上的事件。事件有很多,有我用过的有我没用过的,今天我想分析一...

    klivitamJ 评论0 收藏0

发表评论

0条评论

李义

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<