Yii2事件驱动的运行机制
最近一段时间正在作个一个项目,这个项目会系统逻辑比较复杂,使用PHP Yii2,使用事件驱动机制进行研发,下面就最近研究事件驱动机制的使用作以下总结:
流程如下:
1.要创建含有事件注入的类,一般这样的类都是组件类,即间接或直接的继承自 yii\base\Componet类
2. 要在该类中定义触发是事件名, 一般使用常量来定义,(这样作的好处是再注册事件时,事件名在IDE中可自动完成输入,不容易出错)
eg.
class foo
{
const EVENT_HELLO = 'event_hello';
public function bar()
{
$this->trigger(self::EVENT_HELLO);
}
}
3.注册事件,用on方法(只要继承自component 都有这个方法)
eg. 注册foo类的个一实例事件:
{
$foo = new Foo();
$foo->on(Foo::EVENT_HELLO,事件处理器,'传入数据',$append = true)
/**
其中第一个参数是指事件名,
第二个参数是事件处理器,事件处理器可以是如下几种形式:
$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) { //事件处理逻辑 });
第三个参数是传个事件处理函数的的数据,
第四参数是附加事件顺序,默认是先绑定的先执行,如果最后一个参数值为false,则后来附加的事件会被先执行
*/
$foo->bar() 执行这个方法时会触发 event_hello 事件, 就会执行app\components\Bar,里的静态方法meothodName
}
4.事件处理器,这里以一个类的静态方法为例:
use yii\base\Event;
class handleEvent
{
public static function sendmsg(Event $event) //执行该处理事件时,会将事件句柄$event 传进来
{
var_dump($event->name;)名件名
var_dump($event->sender);事件发送者,即是哪个对象或类上面附加的事件被触发了,
var_dump($event->data)// 即on 方法的第个参数
var_dump($event->handled) 默认值为flase, 如查在某个事件处理器把该数值设为true, 那么他后面附加的事件处理器将不会被执行
}
}
该传入的事件句柄$event 默为yii\base\Event 对象,如果想传入其他一些额外数据,则可以在事件触发方法中传入第二个参数,
$this->trigger(self::EVENT_HELLO,$event);
该$event必须是yii\base\Event是的字类对象,代码如下:
namespace app\components;
use yii\base\Component;
use yii\base\Event; class MessageEvent extends Event
{
public $message;
}
class Mailer extends Component
{
const EVENT_MESSAGE_SENT = 'messageSent'; public function send($message)
{ // ...发送 $message 的逻辑...
$event = new MessageEvent;
$event->message = $message;
$this->trigger(self::EVENT_MESSAGE_SENT,$event);
}
}
该messageEvent 可以单独放在另一个类文件中,这时传入到事件处理器中$event 即为MessageEvent类对象,且拥有了额外数据$event->message
到此,该流程完成
Yii2事件驱动的运行机制的更多相关文章
- Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- PULL解析XML的运行机制详解
PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...
- 深入浅出话VC++(1)——Windows程序内部运行机制
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- Node.js和PHP运行机制对比
为什么要用node.js它又有什么优势呢?一个新的技术被大家喜爱那么它就必然有它的优势,那么下面我们就来简单把它和php做一个对比 1 . Node.js 他用的是JavaScript引擎,那么注定它 ...
- DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能 一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己 ...
- 如何通过setTimeout理解JS运行机制详解
setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...
- [转载]JavaScript 运行机制详解:再谈Event Loop
https://app.yinxiang.com/shard/s8/sh/b72fe246-a89d-434b-85f0-a36420849b84/59bad790bdcf6b0a66b8b93d5e ...
- 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop
PS: 我先旁观下大师们的讨论,得多看书了~ 别人说的:“看了一下不觉得评注对到哪里去,只有吹毛求疵之感. 比如同步异步介绍,本来就无大错:比如node图里面的OS operation,推敲一下就 ...
- windows程序内部运行机制
Windows程序内部运行机制 2007-10-21 19:52 1010人阅读 评论(0) 收藏 举报 windowsvc++applicationcallbackwinapistructure W ...
随机推荐
- oracle 根据出生日期计算年龄的年月日
select years,months,abs( trunc( newer_date- add_months( older_date,years*12+months ) ) ) days from ( ...
- Learning-Python【31】:操作系统基础知识
什么是操作系统 计算机系统由硬件和软件两部分组成.操作系统(OS,Operating System)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充.它在计算机系统中占据了特别重要的地位:而其 ...
- C# 图片缩略图
/// <summary> /// 生成缩略图 /// </summary> /// <param name="sourceFile">原始图片 ...
- git在本地回退
参考https://www.cnblogs.com/qufanblog/p/7606105.html 已经用 git commit 提交了代码. 可以使用 git reset --hard HEAD ...
- 想做AI测试,需要学习哪些数学知识?
摘自知乎的回答 作者:者也 以上是个人读研以来感受用得最多的数学基础课,挂一漏万,大侠请补充指正 高等数学是基础中的基础,研究生以上级别的一切理工科都需要这个打底,数据挖掘.人工智能.模式识别此类跟数 ...
- Median absolute deviation | Singular Value Decomposition奇异值分解 | cumulative sums |
Consider the data (1, 1, 2, 2, 4, 6, 9). It has a median value of 2. The absolute deviations about 2 ...
- django之admin管理工具
admin组件 admin是django提供的基于web的管理工具 >如何使用: 1.激活管理工具 通常会在生成项目时在urls.py中自动设置好 from django.urls import ...
- Fedora 23 U盘启动出现“Failed to load ldlinux.c32”解决
利用UltraISO制作了Fedora 23的U盘启动,开机F12键USB启动时出现 Failed to load ldlinux.c32 Boot failed: please change dis ...
- CopyOnWriteArrayList&Collections.synchronizedList()
1.ArrayList ArrayList是非线性安全,此类的 iterator() 和 listIterator() 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remov ...
- git(一) 基本操作
git简介 产生历史 git是目前世界上最先进的分布式版本控制系统. 2005年,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是git. git的两个特点 版本控制:可以解决多人同时 ...