yii2事件——event

事件理解

事件可以将自定义代码“注入”到现有代码中的特定执行点,附加自定义代码到某个事件,当这个事件被触发时,这段代码会自动执行。如果一个类需要触发事件就应该继承[[yii\base\Component]] 或其子或[yii\base\Event]。

事件类型

实例级别事件,即是继承[[yii\base\Component]] 的基类以支持事件,比较常用。

类级别事件,即是继承[yii\base\Event]实现。要注意是,因为类级别的处理器响应类和其子类的所有实例触发的事件,必须谨慎使用,尤其是底层的基类,如 [[yii\base\Object]]。

事件处理器

事件处理器是一个PHP处理函数,当他所附加的实践被触发时就会执行。

回调函数类型

  1. 字符串形式指定PHP全局函数,如‘trim’
  2. 对象名或方法名数组形式的对象方法,如[new obj(),’’method’]
  3. 类名和方法名数数组形式指定静态方法,如 [$class,$method]
  4. 匿名函数,如 function($event){}

实践处理器的格式

public function method_name($event)
    {
     ... 
    }

通过 $event 参数,事件处理器就获得了以下有关事件的信息

  • [[yii\base\Event::name|event name]]:事件名
  • [[yii\base\Event::sender|event sender]]:调用 trigger() 方法的对象
  • [[yii\base\Event::data|custom data]]:附加事件处理器时传入的数据,默认为空,后文详述

实例级别事件的附加处理器

调用 [[yii\base\Component::on()]] 方法来附加处理器到事件上

public void on ( $name, $handler, $data = null, $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) { 
    //事件处理逻辑 
});

附加事件处理器时可以提供额外数据作为 [[yii\base\Component::on()]] 方法的第三个参数。数据在事件被触发和处理器被调用时能被处理器使用。如:

// 当事件被触发时以下代码显示 "abc" 
// 因为 $event->data 包括被传递到 "on" 方法的数据 
$foo->on(Foo::EVENT_HELLO, function ($event) { 
    echo $event->data; 
}, 'abc');

实例级别事件的解除

public boolean off ( $name, $handler = null )

实例级别事件的触发事件

public void trigger ( $name, yii\base\Event $event = null )

类级别添加处理器

与实例级别事件方法名相同,只是参数有所变化,在执行的时候一般是先执行实例级别事件,再执行类级别事件。

public static void on ( $class, $name, $handler, $data = null, $append = true )

例如在对表的插入数据候成功后,处理器里的代码就会执行

Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
    Yii::trace(get_class($event->sender) . ' is inserted.');
});

触发事件

public static void trigger ( $class, $name, $event = null )

移除事件

public static boolean off ( $class, $name, $handler = null )

 

参考文档:

http://www.cnblogs.com/CraryPrimitiveMan/p/5083478.html

http://www.digpage.com/event.html

http://www.yiibai.com/yii2/concept-events.html

0 条评论
发表一条评论