zoukankan      html  css  js  c++  java
  • Yii框架-深入理解事件

    yii2中使用事件,可以在特定的时间点,触发执行预先设定的一段代码,事件既是代码解耦的一种方式,也是设计业务流程的一种模式。现代软件中,事件无处不在,比如,你发了个微博,触发了一个事件,导致关注你的人,看到了你新发出来的内容。

    在Yii2中可以很好的支持事件,在执行一个操作后,可以触发一个事件,实现不同的功能。
    比如,发布一条微博,微博发送成功后,接下来要通知关注你的人你发布一条微博,在接下来也要通知你微博中@的人,这就是两个相当独立的功能,我们就可以定义好这些独立的事件,在发布成功后,按顺序触发这些事件,一方面可以解耦代码复杂的关系,另一方面利于维护。

    在Yii2中,事件的绑定要通过yiiaseComponent或者其子类来完成,注意, yiiaseObject 不支持事件.所以,当你需要使用事件时,请从 yiiaseComponent 进行继承。同时,Yii中还有一个与事件紧密相关的 yiiaseEvent ,他封装了与事件相关的有关数据,并提供一些功能函数作为辅助。

        on:绑定事件
        //foo类是继承于yiiaseComponent或者其子类
        $foo = new foo();
         
        // 处理器是全局函数
        $foo->on(Foo::EVENT_HELLO, 'function_name');
         
        // 处理器是对象方法
        $foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);
         
        // 处理器是静态类方法
        $foo->on(Foo::EVENT_HELLO, ['appcomponentsBar', 'methodName']);
         
        // 处理器是匿名函数
        $foo->on(Foo::EVENT_HELLO, function ($event) {
            //事件处理逻辑
        });

    第一个参数,其实就是所谓定义事件的语义名称,第二个参数才是处理主体,即事件hander,其实还可以存在第三个参数,即绑定事件时,要传递给处理事件hander处理的数据。

    $foo->on(Foo::EVENT_HELLO, [$object, 'methodName'],'test');

    在事件hander里可以通过$event->data获取到这个传递的参数值:

    class UserController extends Controller {
     
        const EVENT_PUB = 'pub'; //通知关注自己发送新微博的事件
        const EVENT_REQU = 'requ';//通知@的人
     
        public function actionsend() {
            /...
            //发送微博信息的逻辑
            /...
     
            //发送成功后,开始绑定触发的通知关注自己的所有人(自己发了新微博)
            //按顺序将事件绑定在一个数组中
            $Msg = new Msg();
            $this->on(self::EVENT_PUB,[$Msg,'publish'],'我已发新微博');
            $this->on(self::EVENT_REQU,[$Msg,'request'],'我已@您');
     
            //触发
            $this->trigger(self::EVENT_PUB);
            $this->trigger(self::EVENT_REQU);
        }
    }

    //事件处理的类

        class Msg extends ActiveRecord {
            // 触发
            public function publish($event) {
                print_r($event->data);//输出传递过来的‘我已发新微博’
                //做逻辑处理
         
            }
         
            public function request($event) {
                print_r($event->data);//输出传递过来的‘我已@您’
                //做逻辑处理
            }
        }

    但是有时我们所需要的参数不是在事件绑定的时候就传参,而是在触发的时候传参,那么我们可以对所要触发的事件定义属性(传参).因为trigger()函数的第二个参数就是一个对象,也就是$event,所以可以在event类中定义属性,实例化对象后,将$event传递过去,其实就是把需要的参数传递过去。

    定义一个event类:

        <?php
        namespace appmodels;
        use yiiaseEvent;
        class MsgEvent extends Event{
            //下面的这三个参数需要在触发事件时传递
            public $dateTime;   // 微博发出的时间
            public $author;     // 微博的作者
            public $content;    // 微博的内容
        }</span>


    那么在控制器中:

        public function actionTest() {
         
                $Msg = new Msg();
         
                //赋值参数
                $MsgEvent = new MsgEvent();
                $MsgEvent->dateTime = time();
                $MsgEvent->author = 'bingcool';
                $MsgEvent->content = 'hello,everyone';
         
                $this->on(self::EVENT_PUB,[$Msg,'publish'],'我已发新微博');
                
                //第二个参数设为$MsgEvent;
                $this->trigger(self::EVENT_HELLO,$MsgEvent);
         
        }</span>

    那么在事件处理的类:

        class Msg extends ActiveRecord {
            // 触发
            public function publish($event) {
         
                print_r($event->data);//输出传递过来的‘我已发新微博’
                //触发传参数
                print_r($event->anthor);//输出'bingcool'
                print_r($event->content);//输出'hello,everyone'
                //做逻辑处理
         
            }
         
            public function request($event) {
                print_r($event->data);//输出传递过来的‘我已@您’
                //做逻辑处理
            }
        }</span>

    原文转自:https://blog.csdn.net/u012979009/article/details/51496165

  • 相关阅读:
    般若与慈悲
    四谛
    Mysql:8.0.19:新特性、过期、已经删除的
    Mysql:As of 8.0.16:--validate-config:新增的服务器配置验证特效:good!
    Mysql:FIPS:Federal Information Processing Standards 140-2:世上有不透风的墙么?!
    ASP.NET Core WebApi使用Swagger生成API说明文档【xml注释版】
    ASP.NET Core WebApi使用Swagger生成API说明文档【特性版】
    Idea导入Eclipse的Web项目并部署到Tomcat
    在.Net中使用RedLock实现分布式锁
    【转】在C#中使用Json.Net进行序列化和反序列化及定制化
  • 原文地址:https://www.cnblogs.com/lpblogs/p/9372194.html
Copyright © 2011-2022 走看看