yii2框架-yii2的事件(五)

2024-08-23 19:18
文章标签 框架 事件 yii2

本文主要是介绍yii2框架-yii2的事件(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

on:绑定事件
//foo类是继承于yii\base\Component或者其子类
$foo = new foo();// 处理器是全局函数
$foo->on(Foo::EVENT_HELLO, 'function_name');// 处理器是对象方法
$foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);// 处理器是静态类方法
$foo->on(Foo::EVENT_HELLO, ['app\components\Bar', '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 app\models;
use yii\base\Event;
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>




这篇关于yii2框架-yii2的事件(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100270

相关文章

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO