• Yii2事件驱动的运行机制


    最近一段时间正在作个一个项目,这个项目会系统逻辑比较复杂,使用PHP Yii2,使用事件驱动机制进行研发,下面就最近研究事件驱动机制的使用作以下总结:

    流程如下:

    1.要创建含有事件注入的类,一般这样的类都是组件类,即间接或直接的继承自 yiiaseComponet类

     2. 要在该类中定义触发是事件名, 一般使用常量来定义,(这样作的好处是再注册事件时,事件名在IDE中可自动完成输入,不容易出错)

        eg.

    class foo

    {

      const EVENT_HELLO = 'event_hello';

      public function bar()

      {

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

            }

    }

    3.注册事件,用on方法(只要继承自component  都有这个方法)

     eg. 注册foo类的个一实例事件:

    {

      $foo =  new Foo();

      $foo->on(Foo::EVENT_HELLO,事件处理器,'传入数据',$append = true)

      /**

        其中第一个参数是指事件名,

        第二个参数是事件处理器,事件处理器可以是如下几种形式:

        $foo = new Foo;

        // 处理器是全局函数 $foo->on(Foo::EVENT_HELLO, 'function_name');

         // 处理器是对象方法

         $foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);

         // 处理器是静态类方法 $foo->on(Foo::EVENT_HELLO, ['appcomponentsBar', 'methodName']);

         // 处理器是匿名函数 $foo->on(Foo::EVENT_HELLO, function ($event) { //事件处理逻辑 });

        第三个参数是传个事件处理函数的的数据,

        第四参数是附加事件顺序,默认是先绑定的先执行,如果最后一个参数值为false,则后来附加的事件会被先执行

      */

          $foo->bar()  执行这个方法时会触发 event_hello 事件, 就会执行appcomponentsBar,里的静态方法meothodName

    }

    4.事件处理器,这里以一个类的静态方法为例:

    use yiiaseEvent;

    class handleEvent

    {

      public static function sendmsg(Event $event)  //执行该处理事件时,会将事件句柄$event 传进来

      {

        var_dump($event->name;)名件名

        var_dump($event->sender);事件发送者,即是哪个对象或类上面附加的事件被触发了,

          var_dump($event->data)//  即on 方法的第个参数

       var_dump($event->handled) 默认值为flase, 如查在某个事件处理器把该数值设为true, 那么他后面附加的事件处理器将不会被执行

           }

    }

      该传入的事件句柄$event 默为yiiaseEvent 对象,如果想传入其他一些额外数据,则可以在事件触发方法中传入第二个参数,

      $this->trigger(self::EVENT_HELLO,$event);

      该$event必须是yiiaseEvent是的字类对象,代码如下:

    namespace appcomponents;

    use yiibaseComponent;

    use yiibaseEvent; class MessageEvent extends Event

    {

    public $message;

    }

    class Mailer extends Component

    {

    const EVENT_MESSAGE_SENT = 'messageSent'; public function send($message)

    { // ...发送 $message 的逻辑...

    $event = new MessageEvent;

    $event->message = $message;

    $this->trigger(self::EVENT_MESSAGE_SENT,$event);

    }

    }

    该messageEvent 可以单独放在另一个类文件中,这时传入到事件处理器中$event 即为MessageEvent类对象,且拥有了额外数据$event->message

    到此,该流程完成

  • 相关阅读:
    UITextField 获取焦点
    iphone自动隐藏和显示工具栏和导航条
    01maya基础
    Windows10开机自动运行批处理、脚本等的方法
    吉他自学
    设置博客园的博客,不允许选择和复制
    .net简单的静态页生成
    尚未配置为Web项目.指定的本地IIS URL http://localhsst/..要打开项目,需要配置虚拟目录 。是否立即创建虚拟目录 解决
    unity3d自带帮助文档的打开方法
    url重写步骤
  • 原文地址:https://www.cnblogs.com/musings/p/7839375.html
Copyright © 2020-2023  润新知