Yii2事件驱动的运行机制

时间:2021-10-24 07:43:31

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

流程如下:

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

 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, ['app\components\Bar', 'methodName']);

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

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

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

  */

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

}

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

use yii\base\Event;

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 默为yii\base\Event 对象,如果想传入其他一些额外数据,则可以在事件触发方法中传入第二个参数,

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

  该$event必须是yii\base\Event是的字类对象,代码如下:

namespace app\components;

use yii\base\Component;

use yii\base\Event; 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

 

到此,该流程完成