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

来源:互联网 发布:不义联盟网络对战模式 编辑:程序博客网 时间:2024/06/07 04:01

今天学习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这个单例模式去触发各种各样的事件。这些事件又被需要的对象或程序所捕获,对它做出各种各样的一些处理。这样做的好处是在不改动原来的程序或主流逻辑的的情况下,就可以通过这些时间去完成各种各样的操作,让程序有更好的扩展性。