YII2框架学习 扩展篇(二) 事件机制

今天学习YII框架的事件机制,某个对象可以抛出一些事件,而其他的对象可以监听这些事件,然后调用相应的方法。而具体的实现方式可以分为扫描式和绑定式。而YII框架使用的就是绑定式。下面来详细讲解一下。

所谓绑定式,是由事件执行时,通过Component类下的trigger()方法抛出事件,然后通过on()方法来绑定其他对象对此事件的反应。下面通过一个简单的猫叫老鼠跑的例子来说明。这个一个一对一的事件机制。

1.一个一对一的事件机制

cat.php

namespace vendor\animal;
use \yii\base\Component;
class MyEvent extends Event{
    public  $message;
}

class  Cat extends Component{
    public  function  shout(){
        echo 'cat miao<br>';
        $this->trigger('miao',$me);
    }
}
mouse.php

namespace vendor\animal;

class  Mouse{
    public  function run(){
        echo 'mouse running<br>';//老鼠跑事件
    }
}
控制器

namespace app\controllers;
use yii\web\Controller;
use vendor\animal\Cat;
use vendor\animal\Mouse;
use vendor\animal\Dog;
use \yii\base\Event;
class HelloController extends Controller{
    public function actionAbout(){
        $cat = new  Cat;
        $mouse = new Mouse;

        $cat->on('miao',[$mouse,'run']);//为miao事件绑定老鼠跑事件

        $cat->shout();
    }
}
输出为

miao

mouse running


2.带参数的事件

有的时候,事件需要参数才能让其他对象反应的,比如报警119,需要告知着火地点。可以通过trigger来写入事件信息。

cat.php

namespace vendor\animal;
use \yii\base\Component;
use \yii\base\Event;
class MyEvent extends Event{
    public  $message;
}

class  Cat extends Component{
    public  function  shout(){
        echo 'cat miao<br>';//猫叫事件
        $me = new MyEvent;
        $me->message = 'hello<br>';//事件参数
        $this->trigger('miao',$me);//抛出名为miao的事件,附上参数$me对象
    }
}
mouse.php

namespace vendor\animal;

class  Mouse{
    public  function run($me){
        echo $me->message;
        echo 'mouse running<br>';//老鼠跑事件
    }
}

输出

miao

hello

mouse running


3.触发多个事件

可以加上dog.php

namespace vendor\animal;

class  Dog{
    public  function run($me){
        echo $me->message;
        echo 'dog catch<br>';
    }
}

控制器加上

$cat->on('miao',[$dog,'run']);

要想接触绑定

$cat->off('miao',[$dog,'run']);

输出

miao

hello

mouse running

hello

dog catch

4.类触发事件

有的时候,不只是某只实例化的猫,只要是只猫叫就想让老鼠跑的话,可以这么写on

Event::on(Cat::className(),'miao',[$mouse,'run']);


而在应用主体在程序中像一条主线一样,在主线当时是用$app这个单例模式去触发各种各样的事件。这些事件又被需要的对象或程序所捕获,对它做出各种各样的一些处理。这样做的好处是在不改动原来的程序或主流逻辑的的情况下,就可以通过这些时间去完成各种各样的操作,让程序有更好的扩展性。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值