资讯专栏INFORMATION COLUMN

Yii2事件示例解析

tuniutech / 2111人阅读

摘要:事件可以将自定义代码注入到现有代码中的特定执行点。在处理复杂任务时,事件能很好地起到解耦的作用。

事件可以将自定义代码“注入”到现有代码中的特定执行点。 附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行。

在处理复杂任务时,事件能很好地起到解耦的作用。事件相对于硬编码的方式来说也增加了服务器资源开销,所以比较建议在任务较为复杂时使用事件!

以下是实例代码,代码中有详细注释:

控制器
registerEventHandler();
    }

    /**
     * 事件注册
     */
    private function registerEventHandler(){
        //事件处理类
        $msgHandler = new MsgHandler();
        //绑定事件时,可以传入第三个参数。该参数值将会保存到Event类的data属性中
        $this->on(self::BEFORE_SEND,[$msgHandler,"beforeSendMsg"],"who");
        $this->on(self::AFTER_SEND,[$msgHandler,"afterSendMsg"]);
    }

    /**
     * 测试用的方法
     */
    public function actionIndex(){
        //发送信息前的事件类
        $msgBefore = new MsgBeforeEvent();
        $msgBefore->date = date("Y-m-d H:i:s",time());
        //触发发送信息前的事件,传入事件类的实例对象,这里的对象充当了保存临时数据的角色
        $this->trigger(self::BEFORE_SEND,$msgBefore);
        //假设这里是个较为复杂的任务
        echo "发送信息...
";
        //任务执行完毕后,调用发送信息后的事件
        $msgAfter = new MsgAfterEvent();
        $msgAfter->from = "Jack";
        $msgAfter->to = "Lucy";
        $msgAfter->message = "Awesome";
        //触发发送信息后的事件
        $this->trigger(self::AFTER_SEND,$msgAfter);
    }
}
事件处理类

个人觉得可以直接放在models目录下,如果不需要用到数据库操作,可以考虑直接继承Model

date.",extraMsg:".$event->data."
";
        //写入文件中
        file_put_contents("log.txt",$logContent,FILE_APPEND);
    }

    /**
     * 处理发送信息后的事件
     * @param MsgAfterEvent $event
     */
    public function afterSendMsg(MsgAfterEvent $event){
        /**
         * 从event中读取数据
         */
        $logContent = "AFTER!".$event->from."发送给".$event->to.",内容如下:".$event->message."
";
        file_put_contents("log.txt",$logContent,FILE_APPEND);
    }
}

消息发送前的事件类

可以放到models目录下


消息发送后的事件类

可以放到models目录下


处理结果

运行控制器中的index方法后,在log.txt文件中得到如下结果

BEFORE:2017-11-08 14:10:07,extraMsg:who
AFTER!Jack发送给Lucy,内容如下:Awesome

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

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

相关文章

  • 浅析Yii2.0的事件Event

    摘要:全局级别利用实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。类级别通过维护类的属性数组,触发事件时通过类名和事件名称取到当前类以及父类的数据,再通过函数触发。 概念理解:在某一个事件(trigger)发生的时候,触发预先设定(on)的代码,这是代码解耦的一种方式。 事件按照级别分为三类 1. 实例级别 绑定事件、触发事件的类继承的是Component,只在当前示例中运...

    李义 评论0 收藏0
  • yii2框架中的di容器源码中了解反射的作用

    摘要:反射简介参考官方简介的话,具有完整的反射,添加了对类接口函数方法和扩展进行反向工程的能力。此外,反射提供了方法来取出函数类和方法中的文档注释。 反射简介 参考官方简介的话,PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。 YII2框架中示例 对于yii2框架,应该都知道di容器,...

    dantezhao 评论0 收藏0
  • Yii修行之路 - Extension 扩展

    摘要:运行来安装指定的扩展。这更便于用户辨别是否是的扩展。当用户运行安装一个扩展时,文件会被自动更新使之包含新扩展的信息。上述代码表明该扩展依赖于包。例如,上述的条目声明将对应于别名。为达到这个目的,你应当在公开发布前做测试。 简述 扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。 基础 例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加...

    bovenson 评论0 收藏0
  • Yii2 框架核心概念之组件(手册翻译)

    摘要:可以在方法里实现例行检查和属性正常化检查对象方法调用开始的三个阶段都在构造函数里实现,这意味着当你得到一个对象的实例时,它已经被初始化为适当的状态,可以被放心的使用。 组件 组件是YII框架application(应用)的主要组成部分,它是 [yiiaseComponent]的实例或者子类。组件有三个重要特征(功能): 属性(properties) 事件(events) 行为(...

    nemo 评论0 收藏0
  • 再看Yii2

    摘要:之前有两篇文章写了一些关于的和的,现在来全局性地看一看相对于到底有哪些改善。先说安装方法,在中已经使用来管理各种依赖关系,你在安装的时候完全可以用来进行安装,而且,还支持两个不同的安装版和。 之前有两篇文章写了一些关于Yii 2.0的MVC和Yii 2.0的Actived Record,现在来全局性地看一看Yii 2.0相对于Yii 1.1到底有哪些改善。个人总结有一下几个: 1.Y...

    waruqi 评论0 收藏0

发表评论

0条评论

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