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

相关文章

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization