最近一段时间正在作个一个项目,这个项目会系统逻辑比较复杂,使用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事件驱动的运行机制的更多相关文章

  1. Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  2. PULL解析XML的运行机制详解

    PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...

  3. 深入浅出话VC++(1)——Windows程序内部运行机制

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  4. Node.js和PHP运行机制对比

    为什么要用node.js它又有什么优势呢?一个新的技术被大家喜爱那么它就必然有它的优势,那么下面我们就来简单把它和php做一个对比 1 . Node.js 他用的是JavaScript引擎,那么注定它 ...

  5. DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能

    DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能 一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己 ...

  6. 如何通过setTimeout理解JS运行机制详解

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...

  7. [转载]JavaScript 运行机制详解:再谈Event Loop

    https://app.yinxiang.com/shard/s8/sh/b72fe246-a89d-434b-85f0-a36420849b84/59bad790bdcf6b0a66b8b93d5e ...

  8. 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop

    PS: 我先旁观下大师们的讨论,得多看书了~   别人说的:“看了一下不觉得评注对到哪里去,只有吹毛求疵之感. 比如同步异步介绍,本来就无大错:比如node图里面的OS operation,推敲一下就 ...

  9. windows程序内部运行机制

    Windows程序内部运行机制 2007-10-21 19:52 1010人阅读 评论(0) 收藏 举报 windowsvc++applicationcallbackwinapistructure W ...

随机推荐

  1. CMS GC启动参数优化配置

    简介: java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现 ...

  2. 【做题】agc016d - XOR Replace——序列置换&环

    原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...

  3. 【笔记】Cocos2dx学习笔记

    自建场景类 自建场景类BaseScene继承与Scene类,在init函数中添加了默认的,键盘与鼠标事件的响应,添加了一个用于读取XML文件的字典,添加了一个结束场景的方法. 类的声明代码如下: #i ...

  4. 【团队】EasyKing的实现_2

    下载开发版 完成情况 完成了碰撞箱的制作 TODO 子弹攻击范围 音效 英雄技能 建筑 双人联机 物品 小兵 地图移动

  5. Qt Windows打开指定文件注意替换双斜杠为单斜杠

    QProcess::startDetached(QString("explorer %1").arg(strFilePath)); 其中,在windows上使用时,strFileP ...

  6. 使用C#加密及解密字符串

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Util ...

  7. RNN流程

    1.记号 2.前向计算,第二张图是第一张图的公式的简化.其中a称之为隐状态 3.计算代价函数

  8. linux文件管理之链接文件

    文件链接 ====================================================================================软链接 或 符号链接硬 ...

  9. 版本控制——Version Control

    版本控制是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一. 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实 ...

  10. redis pipline 和 事务

    1. Pipeline:“管道”,和很多设计模式中的“管道”具有同样的概念,pipleline的操作,将明确client与server端的交互,都是“单向的”:你可以将多个command,依次发给se ...