Yii2 如何使用事件
原文地址: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.首先需要 定义 事件传递的数据格式类:
- <?php
- namespace myapp\frontend\code\ECM\Customer\events;
- use Yii;
- use yii\base\Model;
- use yii\base\Event;
- /**
- * ContactForm is the model behind the contact form.
- */
- class MessageEvent extends Event
- {
- public $message;
- }
在这个 MessageEvent 里面就定义了一个变量 $message
2.
编写事件: 事件只要定义个hello 函数,然后参数为 上面第一步分传递的$event 对象,里面包含$message 参数,如果这个Event执行
那么。将会写入日志。
- <?php
- namespace myapp\frontend\code\ECM\Customer\events;
- use Yii;
- /**
- * ContactForm is the model behind the contact form.
- */
- class Ha
- {
- public function hello($event){
- Yii::info($event->message,'mylog');
- }
- }
3
绑定和触发事件
- <?php
- namespace myapp\frontend\code\ECM\Cms\controllers;
- use Yii;
- use myapp\frontend\code\ECM\BaseController;
- use myapp\frontend\code\ECM\Customer\events\Ha;
- use myapp\frontend\code\ECM\Customer\events\MessageEvent;
- class IndexController extends BaseController
- {
- # 定义Event的名字
- const EVENT_HELLO = 'my hello';
- public function actionIndex()
- {
- #定义传递数据的格式 Event
- $event = new MessageEvent;
- # 赋值
- $event->message = 'good';
- # 绑定事件Event 这个事件对应的是:Ha->hello($event);
- $this->on(self::EVENT_HELLO, [new \myapp\frontend\code\ECM\Customer\events\Ha(), 'hello']);
- # 触发事件 ,$event 这个对象传递到 Ha->hello($event);
- $this->trigger(self::EVENT_HELLO,$event);
- return $this->render('index');
- }
- }
从这里看,貌似没有多大用处,直接作为参数调用就行了,两边都写代码麻烦
但是,事件是可以不再文件的函数内书写绑定,可以在new 对象之后再绑定
- $foo = new Foo;
- // 处理器是全局函数
- $foo->on(Foo::EVENT_HELLO, 'function_name');
- // 处理器是对象方法
- $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 如何使用事件的更多相关文章
- yii2 内置事件
1.yii2系统登录 const EVENT_BEFORE_LOGIN = 'beforeLogin'; //登录前 const EVENT_AFTER_LOGIN = 'afterLog ...
- yii2中的事件和行为
Event 事件 事件是为了解耦... 注册事件 使用"on add"添加属性,注册事件 使用on方法注册事件. 第三个参数$data是监听函数使用的参数, 第四个$append参 ...
- Yii2事件
namespace app\components; use yii\base\Component; use yii\base\Event; class MessageEvent extends Eve ...
- Yii 2.0 中事件的使用
关于PHP的事件处理,参照 http://www.cnblogs.com/mafeifan/p/4322238.html http://www.cnblogs.com/mafeifan/p/43222 ...
- Yii2之事件处理
通过事件(Event)处理,可以在某个特定时刻执行指定的代码,可以解耦代码,同时也增加了可维护性,通常,事件在客户端软件中比较好理解,比如onClick,onFocus,当点击按钮,获取到焦点时执行指 ...
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- Yii2的深入学习--事件Event
我们先来看下事件在 Yii2 中的使用,如下内容摘自 Yii2中文文档 事件可以将自定义代码“注入”到现有代码中的特定执行点.附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行.例如, ...
- Yii2之事件
众所周知,yii的三大特性是:属性.事件.行为,上一篇博文简单讲解了yii中的属性,本文接着讲讲yii的事件. 事件是代码解耦的一种方式,设计业务流程的一种模式.在yii2.0中,通过Yii\base ...
- PHP观察者模式与Yii2.0事件
1.先看PHP观察者模式的实现: 想要使用事件.必须实现事件的基类.统一的addObserver和trigger方法 定义统一接口.所有的观察者都要实现此接口 //事件的基类 abstract cla ...
随机推荐
- 使用C#改变鼠标的指针形状
1.在一个无标题的窗体中用MOUSEMOVE事件判断鼠标坐标是否到达窗体的边缘,如果是的话将鼠标指针改为可调整窗体大小的双向箭头. private void Form1_MouseMove(o ...
- CSS 实现加载动画之七-彩环旋转
今天整理的这个动画估计大家都不会陌生,彩环旋转,看过之后是不是觉得很熟悉,对,这个就是优酷视频APP里面的加载动画.本人空余时间喜欢看些视频,留意到这个动画后就想用代码实现出来,今天整理了下,跟大家分 ...
- PLC梯形图编程练习
在PLC培训软件中完成如下两个练习,并把对应的梯形图程序发表在博客上. 交通灯控制 在如下图的场景中,打开SW1开关后,交通灯控制器开始工作,关闭SW1则控制器停止工作. SW2为控制模式选择开关: ...
- sass,compass让开发效率飞起
最近开始学习并且使用,发现使用它写起css来真的是各种爽 安装sass,compass sass是依赖于ruby的,必须先安装Ruby,点击下载 下载完ruby之后,使用命令行安装sass ...
- 【开源】XPShadow, 用阴影让UWP更有层次感
UWP采用的是纯扁平化的设计,个人感觉极端了点,整个世界都是平的,导致App分不清层次,看不出重点.其实扁平化是趋势,android, ios都在搞,问题是android, ios都可以很轻松的实现阴 ...
- PHP 系列:PHP Web 开发基础
PHP是动态类型的Web开发的脚本语言,PHP以页面文件作为加载和运行的单元,PHP现在有了Composer作为开发包管理. 1.使用Composer管理依赖 自从.NET开发用了Nuget管理程序集 ...
- Windows Phone8 中如何引用 SQLite 数据库
SQLite数据库介绍 1.SQLite是一款轻型的嵌入式数据库,使用C++开发,使用非常广泛 2.SQLite是一款跨平台的数据库,支持Windows.Linux.Android.IOS.Windo ...
- Python2和Python3 爬虫 转换
由于Python3的不断完善,很多新入Python的小伙伴选择了Python3的阵营,很多人选择了爬虫这一热门话题,但是网络上大部分教程都是Python2 教程,Python3这一块做了些许的改动,对 ...
- php中命名空间的使用
简单使用 命名空间主要解决函数/类冲突的问题.由于PHP中中不允许函数重载,所以我们要使用的到命名空间的.先看一个简单的例子. <?php namespace A; public functio ...
- javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)
一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...