zoukankan      html  css  js  c++  java
  • Yii2之事件处理

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

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

    2.触发某个动作事件

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

    4.执行处理器中的代码

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

    Controller中的代码:

    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类代码:

    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();
    }

    Mouse类代码:

    class Mouse extends yiiaseComponent{
        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时,会依次输出以下结果

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

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

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

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

    yiiaseEvent::on(
        Cat::className(),                     // 第一个参数表示事件发生的类
        Cat::EVENT_AFTER_SHOUT,                  // 第二个参数表示是什么事件
        function ($event) {                      // 对事件的处理
            echo $event->sender;
        }
    );

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

    Yii::$app->on('eventName', function ($event) {
        echo get_class($event->sender);        // 显示当前触发事件的对象的类名称
    });

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

    // 删除所有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');

    来源地址:http://aiddroid.com/yii2-event/

  • 相关阅读:
    【剑指offer】19 顺时针打印矩阵
    【剑指offer】18 二叉树的镜像
    【剑指offer】17 树的子结构
    【剑指offer】16 合并两个排序的链表
    【剑指offer】15 反转链表
    【剑指offer】14 链表中倒数第k个结点
    【剑指offer】13 调整数组顺序使奇数位于偶数前面
    【剑指offer】12 数值的整数次方
    【剑指offer】11 二进制中1的个数
    数据库-第九节:ORM模型迁移
  • 原文地址:https://www.cnblogs.com/yhdsir/p/5181746.html
Copyright © 2011-2022 走看看