yii2事件
事件可以将自定义代码“注入”到现有代码中的特定执行点。
1 yii\base\Event 封装了与时间相关的有关数据并提供了一些功能函数作为辅助
class Event extends Object
{
public $name; // 事件名
public $sender; // 事件发布者,通常是调用了 trigger() 的对象或类。
public $handled = false; // 是否终止事件的后续处理
public $data; // 事件相关数据
private static $_events = [];
public static function on($class, $name, $handler, $data = null, $append = true)
{
// ... ...
// 用于绑定事件handler
}
public static function off($class, $name, $handler = null)
{
// ... ...
// 用于取消事件handler绑定
}
public static function hasHandlers($class, $name)
{
// ... ...
// 用于判断是否有相应的handler与事件对应
}
public static function trigger($class, $name, $event = null)
{
// ... ...
// 用于触发事件
}
}
2、时间handler
所谓时间handler就是时间处理程序,负责时间触发后怎么办的问题,从本质上来说,一个事件handler就是一段PHP代码,即一个PHP函数。
3、事件的绑定和解除
a、yii\base\Component:: on() 就是用来绑定的 b、yii\base\Component:: off() 就是用来解除的
$person = new Person;
// 使用PHP全局函数作为handler来进行绑定
$person->on(Person::EVENT_GREET, 'person_say_hello');
// 使用对象$obj的成员函数say_hello来进行绑定
$person->on(Person::EVENT_GREET, [$obj, 'say_hello']);
// 使用类Greet的静态成员函数say_hello进行绑定
$person->on(Person::EVENT_GREET, ['app\helper\Greet', 'say_hello']);
// 使用匿名函数
$person->on(Person::EVENT_GREET, function ($event) {
echo 'Hello';
});
4 示例
事件类\common\events\MyEvent
<?php
namespace app\common\events;
use yii\base\Event;
class MyEvent extends Event{
const EVENT_SENT_MAIL = 'sent-mail';
const EVENT_CALL_ADMIN = 'call-admin';
const EVENT_TEST = 'test';
public function callAdmin(){
echo 'admin is answer';
}
public static function sentMail($event){
echo 'sent mail';
var_dump($event->data['name']);
var_dump($event->data['email']);
}
}
调用
<?php
namespace app\controllers;
use app\common\events\MyEvent;
use app\models\Admin;
class TestController extends \yii\base\Controller
{
public function actionIndex()
{
//静态方法事件
$model = new Admin();
$model->on(MyEvent::EVENT_SENT_MAIL,['app\common\events\MyEvent','sentMail'],['name'=>'huyongjian','email'=>'[email protected]']);
$model->trigger(MyEvent::EVENT_SENT_MAIL);
echo '<br>';
//对象方法事件
$event = new MyEvent();
$model->on(MyEvent::EVENT_CALL_ADMIN,[$event,'callAdmin'],['name'=>'huyongjian','email'=>'[email protected]']);
$model->trigger(MyEvent::EVENT_CALL_ADMIN);
//匿名函数
$model->on(MyEvent::EVENT_TEST,function ($event){
echo 'test';
});
$model->trigger(MyEvent::EVENT_TEST);
}
}
标签:...,name,public,handler,事件,yii2,EVENT,MyEvent
From: https://www.cnblogs.com/hu308830232/p/18105462