Yii2之事件处理

Yii2之事件处理

经过事件(Event)处理,能够在某个特定时刻执行指定的代码,能够解耦代码,同时也增长了可维护性,一般,事件在客户端软件中比较好理解,好比onClick,onFocus,当点击按钮,获取到焦点时执行指定代码。在PHP中,事件的处理可能不太好理解,可是,只要理清了事件处理的过程,一切都会变得简单:yii2

1.注册(或者说绑定)针对某个动做事件的处理器(handler)app

2.触发某个动做事件yii

3.触发1中注册(绑定)的处理器函数

4.执行处理器中的代码post

 

下面以 猫叫鼠跑 这个例子来简单说明Yii2中的事件处理。this

Controller中的代码:spa

 

1对象

2事件

3get

4

5

6

7

8

9

10

public function actionTest(){

        $cat = new Cat('Tom');

        $mouse = new Mouse('Jerry');

        

        $data = array('msg'=>'miaow miaow miaow!');

        //注册Cat::EVENT_AFTER_SHOUT事件响应(这里对Cat的EVENT_AFTER_SHOUT响应$mouse 的runout方法)

        $cat->on(Cat::EVENT_AFTER_SHOUT, [$mouse,'runout'], $data);

        //触发shout事件

        $cat->shout();

}

Cat类代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Cat extends \yii\base\Component{

    private $_name;

    const EVENT_AFTER_SHOUT = 'afterShout';

    

    function __construct($name) {

        $this->_name = $name;

    }

    

    public function shout(){

        echo 'I am a Cat,I am shouting!';

        //触发事件处理

        $this->trigger(self::EVENT_AFTER_SHOUT);

    }

}

 

Mouse类代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

class Mouse extends \yii\base\Component{

    private $_name;

    

    function __construct($_name) {

        $this->_name = $_name;

    }

    

    public function runout($event){

        //事件名称,事件数据,事件发送者

        var_dump($event->name,$event->data,$event->sender);

        echo 'Cat is shouting,I am a mouse so I need to run!';

    }

}

执行actionTest时,会依次输出如下结果

 

1

I am a Cat,I am shouting!

 

 

1

Cat is shouting,I am a mouse so I need to run!

 

 

在Yii2中,事件分为三个级别:

1.实例事件(同上面的例子,仅对某个实例有效)

2.类事件(对整个类有效)

 

1

2

3

4

5

6

7

yii\base\Event::on(

    Cat::className(),                     // 第一个参数表示事件发生的类

    Cat::EVENT_AFTER_SHOUT,                  // 第二个参数表示是什么事件

    function ($event) {                      // 对事件的处理

        echo $event->sender;

    }

);

3.全局事件(对全局有效)

 

1

2

3

Yii::$app->on('eventName', function ($event) {

    echo get_class($event->sender);        // 显示当前触发事件的对象的类名称

});

 

 

除了绑定事件外,某些场合也须要移除绑定的事件,经常使用方法有如下几种:

PHP

 

1

2

3

4

5

6

7

8

// 删除全部EVENT_AFTER_SHOUT事件的handler

$cat->off(Cat::EVENT_AFTER_SHOUT);

 

// 删除一个对象的成员函数的handler

$cat->off(Cat::EVENT_AFTER_SHOUT, [$mouse, 'runout']);

 

// 删除一个PHP全局函数的handler

$cat->off(Cat::EVENT_AFTER_SHOUT, 'global_onAfterShout');

相关文章
相关标签/搜索