原文地址:http://www.fancyecommerce.com/2016/04/29/yii2-%E4%BD%BF%E7%94%A8event-1-%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%BA%8B%E4%BB%B6/

1.首先需要 定义 事件传递的数据格式类:

  1. <?php
  2. namespace myapp\frontend\code\ECM\Customer\events;
  3. use Yii;
  4. use yii\base\Model;
  5. use yii\base\Event;
  6. /**
  7. * ContactForm is the model behind the contact form.
  8. */
  9. class MessageEvent extends Event
  10. {
  11. public $message;
  12. }

在这个 MessageEvent 里面就定义了一个变量  $message

2.

编写事件:   事件只要定义个hello 函数,然后参数为  上面第一步分传递的$event 对象,里面包含$message 参数,如果这个Event执行

那么。将会写入日志。

  1. <?php
  2. namespace myapp\frontend\code\ECM\Customer\events;
  3. use Yii;
  4. /**
  5. * ContactForm is the model behind the contact form.
  6. */
  7. class Ha
  8. {
  9. public function hello($event){
  10. Yii::info($event->message,'mylog');
  11. }
  12. }

3

绑定和触发事件

  1. <?php
  2. namespace myapp\frontend\code\ECM\Cms\controllers;
  3. use Yii;
  4. use myapp\frontend\code\ECM\BaseController;
  5. use myapp\frontend\code\ECM\Customer\events\Ha;
  6. use myapp\frontend\code\ECM\Customer\events\MessageEvent;
  7. class IndexController extends BaseController
  8. {
  9. # 定义Event的名字
  10. const EVENT_HELLO = 'my hello';
  11. public function actionIndex()
  12. {
  13. #定义传递数据的格式 Event
  14. $event = new MessageEvent;
  15. # 赋值
  16. $event->message = 'good';
  17. # 绑定事件Event 这个事件对应的是:Ha->hello($event);
  18. $this->on(self::EVENT_HELLO, [new \myapp\frontend\code\ECM\Customer\events\Ha(), 'hello']);
  19. # 触发事件 ,$event 这个对象传递到 Ha->hello($event);
  20. $this->trigger(self::EVENT_HELLO,$event);
  21. return $this->render('index');
  22. }
  23. }

从这里看,貌似没有多大用处,直接作为参数调用就行了,两边都写代码麻烦

但是,事件是可以不再文件的函数内书写绑定,可以在new 对象之后再绑定

  1. $foo = new Foo;
  2. // 处理器是全局函数
  3. $foo->on(Foo::EVENT_HELLO, 'function_name');
  4. // 处理器是对象方法
  5. $foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);

也可以在Behavior 行为绑定事件。

譬如在一个类保存的时候可以触发一个 保存后的事件

如果这个类没有绑定事件,那么执行为空

如果绑定,就会执行

1.如果一个Event,被多个类执行,一般使用Behavior的方式进行绑定,譬如  Avtive Record 保存后写入log

这种情况一般是自己写的类,使用别人写的,或者自己写的Event。进行一些处理

2.如果是系统的类,类的事件触发已经写好,但是没有绑定事件,默认什么也没有执行,譬如active Record 的 beforeSave操作

对于这种,我们不能去修改系统的代码,所以,我们可以通过$foo->on()的方式进行绑定,然后在执行save操作,就会触发beforeSave();

当然,我们可以定义一个子类,继承ActiveRecord,然后再里面添加行为。

Yii2 如何使用事件的更多相关文章

  1. yii2 内置事件

    1.yii2系统登录   const EVENT_BEFORE_LOGIN = 'beforeLogin';  //登录前    const EVENT_AFTER_LOGIN = 'afterLog ...

  2. yii2中的事件和行为

    Event 事件 事件是为了解耦... 注册事件 使用"on add"添加属性,注册事件 使用on方法注册事件. 第三个参数$data是监听函数使用的参数, 第四个$append参 ...

  3. Yii2事件

    namespace app\components; use yii\base\Component; use yii\base\Event; class MessageEvent extends Eve ...

  4. Yii 2.0 中事件的使用

    关于PHP的事件处理,参照 http://www.cnblogs.com/mafeifan/p/4322238.html http://www.cnblogs.com/mafeifan/p/43222 ...

  5. Yii2之事件处理

    通过事件(Event)处理,可以在某个特定时刻执行指定的代码,可以解耦代码,同时也增加了可维护性,通常,事件在客户端软件中比较好理解,比如onClick,onFocus,当点击按钮,获取到焦点时执行指 ...

  6. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  7. Yii2的深入学习--事件Event

    我们先来看下事件在 Yii2 中的使用,如下内容摘自 Yii2中文文档 事件可以将自定义代码“注入”到现有代码中的特定执行点.附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行.例如, ...

  8. Yii2之事件

    众所周知,yii的三大特性是:属性.事件.行为,上一篇博文简单讲解了yii中的属性,本文接着讲讲yii的事件. 事件是代码解耦的一种方式,设计业务流程的一种模式.在yii2.0中,通过Yii\base ...

  9. PHP观察者模式与Yii2.0事件

    1.先看PHP观察者模式的实现: 想要使用事件.必须实现事件的基类.统一的addObserver和trigger方法 定义统一接口.所有的观察者都要实现此接口 //事件的基类 abstract cla ...

随机推荐

  1. 集中式版本控制系统:从svn到tfs

    06年进公司的时候,我们没有使用版本控制系统,所有代码都在部门经理的电脑上放着,谁要改什么代码就过去要一份最新的,改好之后再放回去,感觉好原始.据说之前是用过一段时间微软的vss(visual.sou ...

  2. myeclipse 2014新建maven web 项目步骤

    首先在myeclipse中配置maven的安装路径: 在pom.xml中加上: 1 2 3 4 5 6 7 8 9 10  <plugins>           <plugin&g ...

  3. Ubuntu安装uget和aria2下载工具

    Windows下的下载工具有迅雷,快车等.Ubuntu下也有强大的下载工具uget和aria2. 一.安装.uget和aria2都可以在“软件中心”中安装,但是版本太老啦,所以最好还是在终端中添加pp ...

  4. 转摘http://blog.csdn.net/hulihui/article/details/3351922#s6

    译文:构建DataGridView的定制NumericUpDown单元格(Cell)和表格列(Column) 分类: DataGridView控件 2008-11-22 20:58 3555人阅读 评 ...

  5. 简单的3个SQL视图搞定所有SqlServer数据库字典

    网上有很多SQL SERVER数据库字典的SQL语句,七零八落,我在工作整理了一下思路,总结SQL代码如下.数据库字典包括表结构(分2K和2005).索引和主键.外键.约束.视图.函数.存储过程.触发 ...

  6. [USACO2003][poj2138]Travel Games(dp/最长路)

    http://poj.org/problem?id=2138 题意:给你一些单词和初始单词,在初始单词的任意位置你可以加任意一个字母,使得这个新单词在给的单词中有所出现,然后在这样不断迭代下去,让你求 ...

  7. 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)

    方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...

  8. [JQuery EasyUI系列]简介

    一.jQuery EasyUI是一个基于jQuery的框架,继承了各种用户界面插件. 二.jQuery EasyUI框架提供了创建网页所需的一切,可以轻松建立站点. easyui是一个基于jQuery ...

  9. setter方法的内存错误

    - (void)setList:(ClassicList *)list { self.list = list; _titleLabel.text = list.activityName; _addre ...

  10. 从零开始设计SOA框架(三):请求参数的加密方式

    第二章中说明请求参数有哪些,主要是公共参数和业务参数,服务端需要对参数进行效验,已验证请求参数的合法性 参数效验前先解释下以下参数: 1.参数键值对:包括公共参数.业务参数      1.公共参数:按 ...