Yii2 如何使用事件
2016-06-03 09:31
337 查看
原文地址: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,然后再里面添加行为。
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,然后再里面添加行为。
相关文章推荐
- (转载)Laravel学习笔记(一)安装配置开发环境
- js 与 php 时间戳的区别(毫秒与秒的计算方式)
- PHP常用函数封装
- ThinkPHP3.2.3实现分页的方法详解
- PHP学习笔记
- php获取数据库中数据,转成json数据
- 仿制smarty模板
- ThinkPHP3.2.3实现分页的方法详解
- PHP学习笔记之php文件操作
- PHP中读取文件的几个方法总结(推荐)
- PHP读取大文件末尾N行的高效方法推荐
- PHP常用文件操作函数和简单实例分析
- 九个很有用的PHP代码
- 基于Thinkphp开发的微商城
- PPTP服务器配置选项详解
- PHP导入Excel和导出数据为Excel文件
- php excel类 phpExcel使用方法介绍
- PHP之图像处理
- wamp通过phpMyAdmin修改登录密码
- php数组