可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,以及文件上传信息。
为了方便说明,本篇内容的所有示例代码均使用Facade方式,因此需要首先引入
use think\facade\Request;如果你使用的是依赖注入,请自行调整代码为动态调用即可。
主要内容包括:
可以使用has方法来检测一个变量参数是否设置,如下:
Request::has('id','get');Request::has('name','post');变量检测可以支持所有支持的系统变量,包括get/post/put/request/cookie/server/session/env/file。
变量获取使用\think\Request类的如下方法及参数:
变量类型方法('变量名/变量修饰符','默认值','过滤方法')
变量类型方法包括:
| 方法 | 描述 | 
|---|---|
| param | 获取当前请求的变量 | 
| get | 获取 $_GET 变量 | 
| post | 获取 $_POST 变量 | 
| put | 获取 PUT 变量 | 
| delete | 获取 DELETE 变量 | 
| session | 获取 SESSION 变量 | 
| cookie | 获取 $_COOKIE 变量 | 
| request | 获取 $_REQUEST 变量 | 
| server | 获取 $_SERVER 变量 | 
| env | 获取 $_ENV 变量 | 
| route | 获取 路由(包括PATHINFO) 变量 | 
| middleware | 获取 中间件赋值/传递的变量 | 
| file | 获取 $_FILES 变量 | 
| all V6.0.8+ | 获取包括 $_FILES 变量在内的请求变量,相当于param+file | 
PARAM变量PARAM类型变量是框架提供的用于自动识别当前请求的一种变量获取方式,是系统推荐的获取请求参数的方法,用法如下:
// 获取当前请求的name变量Request::param('name');// 获取当前请求的所有变量(经过过滤)Request::param();// 获取当前请求未经过滤的所有变量Request::param(false);// 获取部分变量Request::param(['name', 'email']);
param方法会把当前请求类型的参数和路由变量以及GET请求合并,并且路由变量是优先的。
其它的输入变量获取方法和param方法用法基本一致。
你无法使用get方法获取路由变量,例如当访问地址是
http://localhost/index.php/index/index/hello/name/thinkphp下面的用法是错误的
echo Request::get('name'); // 输出为空正确的用法是
echo Request::param('name'); // 输出thinkphp除了
server和env方法的变量名不区分大小写(会自动转为大写后获取),其它变量名区分大小写。
获取输入变量的时候,可以支持默认值,例如当URL中不包含$_GET['name']的时候,使用下面的方式输出的结果比较。
Request::get('name'); // 返回值为nullRequest::get('name',''); // 返回值为空字符串Request::get('name','default'); // 返回值为default前面提到的方法都支持在第二个参数中传入默认值的方式。
框架默认没有设置任何全局过滤规则,你可以在
app\Request对象中设置filter全局过滤属性:
namespace app;class Request extends \think\Request{    protected $filter = ['htmlspecialchars'];}也支持使用Request对象进行全局变量的获取过滤,过滤方式包括函数、方法过滤,以及PHP内置的Types of filters,我们可以设置全局变量过滤方法,支持设置多个过滤方法,例如:
Request::filter(['strip_tags','htmlspecialchars']),也可以在获取变量的时候添加过滤方法,例如:
Request::get('name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤Request::param('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤Request::post('name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤可以支持传入多个过滤规则,例如:
Request::param('username','','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤如果当前不需要进行任何过滤的话,可以使用
// 获取get变量 并且不进行任何过滤 即使设置了全局过滤Request::get('name', '', null);对于body中提交的
json对象,你无需使用php://input去获取,可以直接当做表单提交的数据使用,因为系统已经自动处理过了
如果你只需要获取当前请求的部分参数,可以使用:
// 只获取当前请求的id和name变量Request::only(['id','name']);采用
only方法能够安全的获取你需要的变量,避免额外变量影响数据处理和写入。
only方法可以支持批量设置默认值,如下:
// 设置默认值Request::only(['id'=>0,'name'=>'']);表示id的默认值为0,name的默认值为空字符串。
默认获取的是当前请求参数(PARAM类型变量),如果需要获取其它类型的参数,可以在第二个参数传入,例如:
// 只获取GET请求的id和name变量Request::only(['id','name'], 'get');// 等效于Request::get(['id', 'name']);// 只获取POST请求的id和name变量Request::only(['id','name'], 'post');// 等效于Request::post(['id', 'name']);也支持排除某些变量后获取,例如
// 排除id和name变量Request::except(['id','name']);同样支持指定变量类型获取:
// 排除GET请求的id和name变量Request::except(['id','name'], 'get');// 排除POST请求的id和name变量Request::except(['id','name'], 'post');支持对变量使用修饰符功能,可以一定程度上简单过滤变量,更为严格的过滤请使用前面提过的变量过滤功能。
用法如下:
Request::变量类型('变量名/修饰符');
支持的变量修饰符,包括:
| 修饰符 | 作用 | 
|---|---|
| s | 强制转换为字符串类型 | 
| d | 强制转换为整型类型 | 
| b | 强制转换为布尔类型 | 
| a | 强制转换为数组类型 | 
| f | 强制转换为浮点类型 | 
下面是一些例子:
Request::get('id/d');Request::post('name/s');Request::post('ids/a');可以在中间件里面设置和获取请求变量的值,这个值的改变不会影响PARAM变量的获取。
<?phpnamespace app\http\middleware;class Check{    public function handle($request, \Closure $next)    {        if ('think' == $request->name) {        	$request->name = 'ThinkPHP';        }        return $next($request);    }}为了简化使用,还可以使用系统提供的input助手函数完成上述大部分功能。
判断变量是否定义
input('?get.id');input('?post.name');获取PARAM参数
input('param.name'); // 获取单个参数input('param.'); // 获取全部参数// 下面是等效的input('name');input('');获取GET参数
// 获取单个变量input('get.id');// 使用过滤方法获取 默认为空字符串input('get.name');// 获取全部变量input('get.');使用过滤方法
input('get.name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤input('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤input('post.name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤使用变量修饰符
input('get.id/d');input('post.name/s');input('post.ids/a');