yii2事件

yii2事件

事件可以将自定义代码“注入”到现有代码中的特定执行点。

1 yii\base\Event 封装了与时间相关的有关数据并提供了一些功能函数作为辅助

class Event extends Object
{
    public $name;               // 事件名
    public $sender;             // 事件发布者,通常是调用了 trigger() 的对象或类。
    public $handled = false;    // 是否终止事件的后续处理
    public $data;               // 事件相关数据

    private static $_events = [];

    public static function on($class, $name, $handler, $data = null, $append = true)
    {
        // ... ...
        // 用于绑定事件handler
    }

    public static function off($class, $name, $handler = null)
    {
        // ... ...
        // 用于取消事件handler绑定
    }

    public static function hasHandlers($class, $name)
    {
        // ... ...
        // 用于判断是否有相应的handler与事件对应
    }

    public static function trigger($class, $name, $event = null)
    {
        // ... ...
        // 用于触发事件
    }
}

2、时间handler

所谓时间handler就是时间处理程序,负责时间触发后怎么办的问题,从本质上来说,一个事件handler就是一段PHP代码,即一个PHP函数。

3、事件的绑定和解除

a、yii\base\Component:: on() 就是用来绑定的 b、yii\base\Component:: off() 就是用来解除的

$person = new Person;

// 使用PHP全局函数作为handler来进行绑定
$person->on(Person::EVENT_GREET, 'person_say_hello');

// 使用对象$obj的成员函数say_hello来进行绑定
$person->on(Person::EVENT_GREET, [$obj, 'say_hello']);

// 使用类Greet的静态成员函数say_hello进行绑定
$person->on(Person::EVENT_GREET, ['app\helper\Greet', 'say_hello']);

// 使用匿名函数
$person->on(Person::EVENT_GREET, function ($event) {
    echo 'Hello';
});

4 示例

事件类\common\events\MyEvent

<?php
namespace app\common\events;
use yii\base\Event;

class MyEvent extends Event{
    const EVENT_SENT_MAIL = 'sent-mail';

    const EVENT_CALL_ADMIN = 'call-admin';

    const EVENT_TEST = 'test';

    public function callAdmin(){
        echo 'admin is answer';
    }

    public static function sentMail($event){
        echo 'sent mail';
        var_dump($event->data['name']);
        var_dump($event->data['email']);
    }
}

调用

<?php
namespace app\controllers;
use app\common\events\MyEvent;
use app\models\Admin;

class TestController extends \yii\base\Controller
{
    public function actionIndex()
    {
        //静态方法事件
        $model = new Admin();
        $model->on(MyEvent::EVENT_SENT_MAIL,['app\common\events\MyEvent','sentMail'],['name'=>'huyongjian','email'=>'308830232@qq.com']);
        $model->trigger(MyEvent::EVENT_SENT_MAIL);

        echo '<br>';
        //对象方法事件
        $event = new MyEvent();
        $model->on(MyEvent::EVENT_CALL_ADMIN,[$event,'callAdmin'],['name'=>'huyongjian','email'=>'308830232@qq.com']);
        $model->trigger(MyEvent::EVENT_CALL_ADMIN);

        //匿名函数
        $model->on(MyEvent::EVENT_TEST,function ($event){
            echo 'test';
        });
        $model->trigger(MyEvent::EVENT_TEST);
    }
}
 
posted @ 2024-03-30 14:37  胡勇健  阅读(5)  评论(0编辑  收藏  举报