zoukankan      html  css  js  c++  java
  • YII框架的事件机制

    一、什么是事件机制

    解释:发生了一件事情,然后某些东西对这件事作出反应。

    例子:假设发生了A同学结婚事件,然后B同学给份子钱反应,那么,B是怎么知道(监听)A事件的发生了呢,有两种办法。

    扫描式:B不断的询问A是否要结婚。

    绑定式:A要结婚的时候会及时通知B。

    二、Yii框架的事件实现方式

    Yii采用的是观察者模式来实现事件机制。

    事件的监听方式,采用的是,绑定式。

    绑定级别有,对象级别绑定,类级别绑定。

    下面是代码实例。

    1、在 vendor 目录下 新建 classmate 并制作 A同学,B同学类,C同学类。

    A同学类。

    <?php
    namespace vendorclassmate;
    use yiiaseComponent;
    use yiiaseEvent;
    
    class MyEvent extends Event{ //继承事件类
        public $message;
    }
    
    class A_classmate extends Component //继承组件类
    {
        /**
         * A 同学结婚
         */
        function marry() {
            echo 'A:我要结婚了!<br/>';
            $msg = new MyEvent;
            $msg->message = '多少随意<br/>';
            // 事件结束的时候通知绑定在这个事件上的方法。
            $this->trigger('marry',$msg); //第一个参数是事件名称,第二个参数是需要传递给监听方法的参数 它是一个对象
        }
    }

    B同学类。

    <?php
    namespace vendorclassmate;
    class B_classmate
    {
        /**
         * B 同学给份子钱
         */
        function member_money($e) {
            echo $e->message; //接受到事件结束时候传递的参数
            echo 'B:份子钱已备好,拿去不谢!<br/>';
        }
    }

    C同学类。

    <?php
    namespace vendorclassmate;
    class C_classmate
    {
        /**
         * C 同学给份子钱
         */
        function member_money($e) {
            echo $e->message; //接受到事件结束时候传递的参数
            echo 'C:份子钱已备好,拿去不谢!<br/>';
        }
    }

    2、在控制器中调用上面的三个类。

    <?php
    namespace appcontrollers;
    use yiiwebController; 
    use YII;
    use vendorclassmateA_classmate;
    use vendorclassmateB_classmate;
    use vendorclassmateC_classmate;
    use yiiaseEvent;
    
    class TestController extends Controller
    {
        public function actionIndex() {
            $A_classmate = new A_classmate();
            $B_classmate = new B_classmate();
            $C_classmate = new C_classmate();
            //将事件与对象方法进行绑定 解绑方法是 off
            $A_classmate->on('marry',[$B_classmate,'member_money']); //对象级别的事件绑定
            Event::on(A_classmate::className(),'marry',[$C_classmate,'member_money']); //类级别的对象绑定
            Event::on(A_classmate::className(),'marry',function(){ //类级别绑定匿名函数 注意对象级别也可以绑定匿名函数
                echo 'D:呵呵,没空!<br/>';
            });
            //发生事件
            $A_classmate->marry(); 
        }
    }

    3、表现在浏览器上的效果是。

    三、总结

    yii通过这种事件机制,实现了在整个请求处理过程中,不改动原有逻辑的情况下,十分方便的添加其它处逻辑。

  • 相关阅读:
    『笔记』数学数论(八)
    『笔记』BSGS
    『笔记』组合数学(六)
    01 分数规划
    高斯消元
    拉格朗日插值法
    洛谷网课数论
    [IOI2013]robots 机器人
    P3530 [POI2012]FES-Festival
    NOIP 2015 day1
  • 原文地址:https://www.cnblogs.com/buexplain/p/4857453.html
Copyright © 2011-2022 走看看