URL - 获取请求参数

  • 作者:KK

  • 发表日期:2016.12.10


request组件的get post获取参数

一般都是在控制器里获取请求的参数,很简单,这是靠request组件来实现的,它是HTTP客户端请求数据的处理组件

既然是这个组件,肯定是 Yii::$app->request这样写了,它有一个get方法获取get参数,还有个post方法也就是获取post参数

比如Yii::$app->request->get('userId')

Yii::$app->request->get('userId', 223)就是定义默认值,没有userId就默认返回223

post方法的用法和get是一样的,不过这里先不建议你使用post测试获取先,因为你可能会取不到值,后面有对于POST请求的专门讲解


获取所有参数

$getParams = Yii::$app->request->get(); //不传参数就返回整个数组
$postParams = Yii::$app->request->post();

新手误区

假如请求时POST的name值是abc,以下代码企图模拟数据测试时会让新手失望:

$_POST['name'] = 'jay';
echo Yii::$app->request->post('name'); //abc

至于为什么得不到jay,简单地说Yii在初始化的时候就已经装载了参数,你后期修改$_POST或$_GET它也不再自动重新装载

想要重新装载请见相关文章《Yii2 经验分享 - 常见误区 - 企图修改POST数组模拟数据


题外话:强转保安全

在安全角度,我对参数处理有要求,因为客户端/浏览器可以欺骗服务端,发送非数字的userId过来,所以根据实际的参数使用逻辑,要做相对应的类型强制转换

比如 $userId = (int)Yii::$app->request->get('userId', 123); 获取不到还好,默认是123

要是获取到一个数组,没有用(int)做强转的话,后面要是$userId + 789 就会因为数组无法做加法运算而出错了,多几个代码样本:

$isTop = (bool)Yii::$app->request->post('isTop');	//是否置顶,无论post的is_top内容是什么,只要非空就会转成true,否则就转成false
$aUserList = (array)Yii::$app->request->post('userList');	//如果前端要添加用户列表,发来的用户列表数据要转成array才能for循环,就是防止前端发送一个字符串导致for循环报错,但这里for内部也要对item做强转
$age = (int)Yii::$app->request->post('age', 18);	//你懂的,就一个年龄,强转成int
$name = (string)Yii::$app->request->post('name', '默认姓名');	//本节完

转好过不转嘛