#### 请求变量
ThinkPHP5使用了请求对象(由think\Request类实现)来记录当前请求的相关信息和执行相关操作,而获取请求变量是请求对象的一个重要用途。
例如,在原生PHP开发中经常会被使用的 $_GET、$_POST、$_SESSION和$_COOKIE等变量都被统一封装到请求对象的方法里面,取而代之的是使用请求对象的get()、post()、session()和 cookie()方法来获取当前请求的系统变量。
为什么要用请求对象的方法来替代原生的系统变量呢?首先直接操作系统变量存在很多的不便和不足,例如大写变量、不支持过滤和批量读取、排除等等细节,其次,也不利于单元测试。
在控制器操作方法中获取请求变量的方法如下:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 获取当前的GET变量
dump(Request::instance()->get());
// 或者使用助手函数
dump(request()->get());
}
}
~~~
`request`函数是系统提供的一个简化读取的助手函数,用于获取当前请求对象的单例。在`ThinkPHP5`中,你不需要根据当前请求类型来判断使用`get()`还是`post()`方法(事实上这是一个很愚蠢的做法),框架提供了一个专门的`param()`方法来统一获取当前请求的变量,会自动识别当前的请求类型(支持`PUT`/`DELETE`等所有的请求类型)获取不同的请求变量,例如:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 获取当前的请求变量
dump(Request::instance()->param());
// 或者使用助手函数
dump(request()->param());
}
}
~~~
获取单个变量的方式
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 获取当前的请求变量
dump(Request::instance()->param('name'));
// 或者使用助手函数
dump(request()->param('name'));
}
}
~~~
官方的建议是最好弃用get()、post() 这些方法,直接使用param()方法。
param方法的优势包括:支持统一过滤以及更方便的调用多级变量,下面举个例子说明。
> 框架默认并没有设置任何的过滤机制,请根据应用的需要设置全局的过滤规则。
首先设置全局过滤规则如下:
~~~
// 默认全局过滤方法
'default_filter' => 'htmlspecialchars',
~~~
控制器的hello方法改为:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 获取当前的请求变量
dump(Request::instance()->param('data.name', '', 'strtoupper'));
// 或者使用助手函数
dump(request()->param('data.name', '', 'strtoupper'));
}
}
~~~
如果要判断某个请求变量是否存在,可以使用:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function hello()
{
// 判断变量是否存在(当前请求变量中)
dump(request()->has('name'));
// 判断是否存在get变量
dump(request()->has('name', 'get'));
// 或者使用助手函数
dump(input('?name'));
dump(input('?get.name'));
}
}
~~~
系统还提供了获取多个变量的筛选方法(不是获取所有变量):
~~~
<?php
namespace app\index\controller;
class Index
{
public function hello()
{
// 获取请求变量中的id和name变量
dump(request()->only('id,name'));
// 获取请求变量中的id以外的变量
dump(request()->except('id'));
}
}
~~~
`only`表示只获取部分变量,`except`表示获取除了排除变量之外的所有变量
在模板文件中输出请求变量,可以无需进行模板变量赋值而是直接输出即可,方式如下:
~~~
{// 输出name请求变量 }
{$Request.param.name}
~~~
![](https://box.kancloud.cn/83596907e25afa981ed0afc7b5dc7add_387x589.png)