常见误区 - 企图修改POST数组模拟数据

  • 作者:KK

  • 发表日期:2016.09.07

  • 更新日期:2016.11.10

    在末尾补充了模拟GET参数的内容


问题

通常你直接修改POST数组后,重新用Yii::$app->request->post()取出的数据都是旧的

所以这种情况下你就应该意识到:Yii是提前装载了POST数据了

//假设原本 $_POST['name'] 的值是 Marie

public function actionTest(){
	$_POST['name'] = 'Jay';
	return Yii::$app->request->post('name');
}

结果只会得到旧的值“Marie” 而不是“Jay”


正确姿势

public function actionTest(){
	$mockPost = [
		'name' => 'Jay'
	];
	Yii::$app->request->setBodyParams($mockPost); //会整个原来的POST都被覆盖
	echo Yii::$app->request->post('name'); //Jay
	
	//单独覆盖其中一个
	$post = Yii::$app->request->post(); //要先整个POST数组取出
	$post['name'] = 'Jay2'; //修改指定的值
	Yii::$app->request->setBodyParams($post); //然后整个设回去,这样其它POST数组就不会被抹掉了
	echo Yii::$app->request->post('name'); //Jay2
}

模拟GET

模拟GET参数的思路和POST一模一样,只是操作的方法名称不一样

在要修改的GET参数数组时,将setBodyParams这个方法换成setQueryParams即可