菜鸟常忽略的基础 - 在配置里定义事件

  • 作者:KK

  • 发表日期:2016.10.15


先看看基本的on方法事件监听方式

比如yii\web\Response有一个事件是yii\web\Response::EVENT_BEFORE_SEND事件,表示响应数据发送前

那如果我们想要在数据发送给用户前做点什么事,基本的用法就是通过代码来绑定事件:

Yii::$app->response->on(yii\web\Response::EVENT_BEFORE_SEND, function($event){
	if(is_string($event->sender->data)){
		$event->sender->data = '以下是HTML内容:' . $event->sender->data;
	}
});

但官方好像没有专门地讲过可以通过配置来监听事件,虽然略为提过,但不是专门讲这个的


来,通过配置监听

好了其实我们可以在配置文件里这样来监听事件:

  1. 先要知道你的事件名称,通过Response的源代码可以得知EVENT_BEFORE_SEND这个常量的值是beforeSend,或者你echo Yii::$app->response::EVENT_BEFORE_SEND也是能看到这个值的

  2. 配置就是定义一个个类的属性嘛,第一层是定义app的属性,components里就是定义每一个组件的属性

要通过配置实现监听事件,这回就不是定义类的属性了,写法是这样的,在key的前面加个on

return [
	//Application的配置
	'components' => [
		//其它组件的配置
		'response' => [
			//重点在这里,先写on加空格,然后就写事件的标记值
			'on beforeSend' => function($event){
				if(is_string($event->sender->data)){
					$event->sender->data = '<p>维护通知:本站将于15号凌晨1点到3点暂时关闭访问</p>' . $event->sender->data;
				}
			}
		],
	],
];

在配置里定义类的事件就是on 事件标记符这样的写法来定义要监听的事件


动态配置创建对象时附加监听

$config = [
	'name' => 'Jay',
	'age' => 11,
	'on init' => function(){
		echo '模型初始化了';
	},
	'on beforeInsert' => function(){
		echo '要insert入库了';
	},
];

$user = new User($config); //模型初始化了
$user->save(); //要insert入库了