Yii2 事件 Event 触发,事件传递参数在监听函数读取方式

星婷酱_9174

星婷酱_9174

2026-10-04

166人浏览

原创

推荐使用继承 yii\base\event 的自定义事件类传递参数,需将字段声明为 public 属性;匿名函数可借助 $event->data,但直接传数组或简单值无效。

yii2 事件 event 触发,事件传递参数在监听函数读取方式

在 Yii2 中,触发自定义事件并传递参数后,在事件监听(处理)函数中读取参数,核心是通过继承 yii\base\Event 的自定义事件类,或使用匿名函数/闭包配合 $event 对象的 $data 属性。直接用数组或简单值传参是无效的——Yii2 事件机制要求参数必须封装在 $event 实例中。

使用自定义事件类(推荐,类型安全、可扩展)

定义一个继承 yii\base\Event 的子类,把需要传递的字段声明为 public 属性:

// components/OrderPaidEvent.php
<?php namespace app\components;

use yii\base\Event;

class OrderPaidEvent extends Event
{
    public $orderId;
    public $amount;
    public $userId;
}

触发时创建该事件实例并赋值:

// 在业务逻辑中触发
use app\components\OrderPaidEvent;

$event = new OrderPaidEvent();
$event->orderId = 123;
$event->amount = 99.9;
$event->userId = 456;

$this->trigger('order.paid', $event);

监听函数中直接访问属性:

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
// 绑定监听(例如在控制器 init() 或行为 attach() 中)
$this->on('order.paid', function ($event) {
    echo "订单 {$event->orderId} 支付成功,金额 {$event->amount}";
});

使用 $event->data 传递简单数据(轻量场景)

若只需传 1–2 个简单值(如字符串、数字、数组),可复用 yii\base\Event 自带的 $data 属性:

  • 触发时:将参数作为 $data 传入(支持任意类型,常用数组)
  • 监听时:从 $event->data 取值,需自行判断结构
// 触发
$this->trigger('user.login', new \yii\base\Event([
    'data' => ['userId' => 789, 'ip' => '192.168.1.1']
]));

// 监听
$this->on('user.login', function ($event) {
    $data = $event->data;
    if (is_array($data)) {
        echo "用户 {$data['userId']} 登录,IP:{$data['ip']}";
    }
});

注意:不能直接 trigger('xxx', ['a'=>1, 'b'=>2])

以下写法不会生效,因为 Yii2 的 trigger() 第二个参数必须是 Event 实例:

// ❌ 错误:数组会被忽略,$event 在监听器里是空的 yii\base\Event 实例
$this->trigger('test', ['msg' => 'hello']);

// ✅ 正确:必须包装成 Event 对象
$this->trigger('test', new \yii\base\Event(['data' => ['msg' => 'hello']]));

监听函数签名与 $event 对象来源

无论哪种方式,监听函数接收到的 $event 都是 yii\base\Event 或其子类实例。它默认包含:

  • $event->name:事件名(如 'order.paid')
  • $event->sender:触发事件的对象(即 $this)
  • $event->handled:是否已被处理(可用于中断后续监听)
  • $event->data:手动传入的附加数据(仅当构造时指定)
  • 若为自定义类,还有你声明的全部 public 属性

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

5695

14

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

302

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

324

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

203

15

PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

2910

22

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

60

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习

Yii2框架基础视频教程
Yii2框架基础视频教程

共22课时 | 2.8万人学习