yii2-事件

yii2事件 : 可以在特定的时间点,触发执行预先设定的一段代码,事件既是代码解耦的一种方式,也是设计业务流程的一种模式。现代软件中,事件无处不在,比如,你发了个微博,触发了一个事件,导致关注你的人,看到了你新发出来的内容。
在Yii2中可以很好的支持事件,在执行一个操作后,可以触发一个事件,实现不同的功能。
比如,发布一条微博,微博发送成功后,接下来要通知关注你的人你发布一条微博,在接下来也要通知你微博中@的人,这就是两个相当独立的功能,我们就可以定义好这些独立的事件,在发布成功后,按顺序触发这些事件,一方面可以解耦代码复杂的关系,另一方面利于维护。
在Yii2中,事件的绑定要通过yii\base\Component或者其子类来完成. 注意: yii\base\Object 不支持事件.所以,当你需要使用事件时,请从 yii\base\Component 进行继承。同时,Yii中还有一个与事件紧密相关的 yii\base\Event ,他封装了与事件相关的有关数据,并提供一些功能函数作为辅助。
on绑定事件共有3个参数
[php] view plain copy
on:绑定事件所有格式    
//foo类是继承于yii\base\Component或者其子类    
$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) {    
    //事件处理逻辑    
});    
第一个参数,其实就是所谓定义事件的语义名称(第一个参数就是绑定的事件名称, 也就是trigger时候的名称 如$this->trigger(Foo::EVENT_HELLO)),第二个参数才是处理主体,即事件hander,其实还可以存在第三个参数,即绑定事件时,要传递给处理事件hander处理的数据。
[php] view plain copy
$foo->on(Foo::EVENT_HELLO, [$object, 'methodName'],'test');  
在事件hander(参数二)里可以通过$event->data获取到这个传递的参数值:
//事件处理的类(model类)
[php] view plain copy
class Msg extends ActiveRecord {    
    // 触发    
    public function publish($event) {    
        print_r($event->data);//输出传递过来的‘我已发新微博’    
        //做逻辑处理    

    }    

    public function request($event) {    
        print_r($event->data);//输出传递过来的‘我已@您’    
        //做逻辑处理    
    }    
}    
控制器类
[php] view plain copy
class UserController extends Controller {    

    const EVENT_PUB = 'pub'; //通知关注自己发送新微博的事件    
    const EVENT_REQU = 'requ';//通知@的人    

    public function actionsend() {    
        /...    
        //发送微博信息的逻辑    
        /...    

        //发送成功后,开始绑定触发的通知关注自己的所有人(自己发了新微博)    
        //按顺序将事件绑定在一个数组中    
        $Msg = new Msg();    
        $this->on(self::EVENT_PUB,[$Msg,'publish'],'我已发新微博');    
        $this->on(self::EVENT_REQU,[$Msg,'request'],'我已@您');    

        //触发    
        $this->trigger(self::EVENT_PUB);    
        $this->trigger(self::EVENT_REQU);    
    }    
}    
* 以上是on绑定时候传参,下面是trigger时候传参

有时我们所需要的参数不是在事件绑定的时候就传参,而是在触发的时候传参,那么我们会用到trigger的第二个参数, 传入自定义重写的event类,重写的event类是继承自yii2的Event类(第二个参数默认是yii2的Event类),在重写的event类中的属性就是在trigger时候要传入的参数
定义一个event类(model类):
[php] view plain copy
<?php    
namespace app\models;    
use yii\base\Event;    
class MsgEvent extends Event{    
    //下面的这三个参数需要在触发事件时传递    
    public $dateTime;   // 微博发出的时间    
    public $author;     // 微博的作者    
    public $content;    // 微博的内容    
}  
因为trigger()函数的第二个参数就是一个对象也就是$event,所以可以在event类中定义属性,实例化对象后,将$event传递过去,其实就是把需要的参数传递过去。
那么在控制器中(Controller):
[php] view plain copy
public function actionTest() {    

        $Msg = new Msg();    

        //赋值参数    
        $MsgEvent = new MsgEvent();    
        $MsgEvent->dateTime = time();    
        $MsgEvent->author = 'bingcool';    
        $MsgEvent->content = 'hello,everyone';    

        $this->on(self::EVENT_PUB,[$Msg,'publish'],'我已发新微博');    

        //第二个参数设为$MsgEvent;    
        $this->trigger(self::EVENT_HELLO,$MsgEvent);    

}  
那么在事件处理的类(model类):
分别显示on绑定时候的数据和trigger时候的数据
[php] view plain copy
class Msg extends ActiveRecord {    
    // 触发    
    public function publish($event) {    
        //$event->data是on绑定时候的参数  
        print_r($event->data);//输出传递过来的‘我已发新微博’    
        //触发传参数    
        print_r($event->anthor);//输出'bingcool'    
        print_r($event->content);//输出'hello,everyone'    
        //做逻辑处理    

    }    

    public function request($event) {    
        print_r($event->data);//输出传递过来的‘我已@您’    
        //做逻辑处理    
    }    
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值