ThinkPHP5中Request请求对象大全
在ThinkPHP5框架中,HTTP请求信息是通过Request对象来处理的。无论是获取用户提交的参数、上传的文件,还是判断请求类型、获取路由信息,都离不开Request对象。掌握Request对象的各种用法,是高效开发ThinkPHP5应用的基础。本文将全面梳理Request请求对象的常用方法与实战技巧。
一、获取Request对象
在ThinkPHP5中,获取Request对象主要有三种方式,适用于不同的开发场景。
通过助手函数:
request(),这是最快捷的方式,可以在任何地方调用。通过Facade调用:
thinkfacadeRequest,适合在无法使用依赖注入的静态方法中使用。通过依赖注入:在控制器方法中直接声明
Request $request,这是官方推荐的最佳实践。
// 1. 使用助手函数
$request = request();
// 2. 使用Facade
$request = thinkfacadeRequest::instance();
// 3. 使用依赖注入
public function index(thinkRequest $request)
{
// 直接使用 $request 对象
}二、获取请求信息
Request对象封装了客户端请求的所有底层信息,包括请求方法、域名、URL以及请求头等。
1. 请求方法与协议
// 获取当前请求类型(如GET、POST、PUT等) $request->method(); // 判断是否为HTTPS请求 $request->isSsl();
2. 访问地址与域名
在构建分页、重定向或API接口时,经常需要获取当前的URL信息。
$request->domain(); // 获取当前包含协议的域名,例如:https://www.ipipp.com $request->url(); // 获取当前完整URL地址(包含QUERY_STRING) $request->baseUrl(); // 获取当前URL地址(不含QUERY_STRING) $request->pathinfo(); // 获取当前URL地址的pathinfo信息 $request->ext(); // 获取当前URL地址的后缀 $request->query(); // 获取URL中的查询字符串
3. 请求头信息
在API开发中,经常需要获取Header中的认证信息或自定义参数。
$request->header(); // 获取所有请求头信息(数组)
$request->header('accept'); // 获取指定的请求头信息三、获取输入数据
获取输入数据是Request对象最核心的功能。ThinkPHP5提供了多种获取不同来源数据的方法,避免直接操作超全局变量。
1. param方法(自动识别)
param方法是获取输入数据最常用的方式。系统会自动识别当前请求类型,如果是GET请求则获取GET数据,如果是POST请求则获取POST数据。其优先级为:路由变量 > POST > GET。
$request->param(); // 获取所有参数
$request->param('id'); // 获取名为id的参数
$request->param('id', 0); // 获取参数id,如果不存在则返回默认值0
$request->param('id', 0, 'intval'); // 获取参数并进行数据类型转换2. get与post方法
如果明确需要获取特定来源的数据,应使用专门的获取方法,这样更加安全严谨。
// 获取GET参数
$request->get(); // 获取所有GET参数
$request->get('id'); // 获取指定GET参数
// 获取POST参数
$request->post(); // 获取所有POST参数
$request->post('name'); // 获取指定POST参数3. input助手函数
input助手函数可以更加方便地获取变量,底层调用的依然是Request对象的方法。
input('get.id'); // 获取GET参数id
input('post.name'); // 获取POST参数name
input('param.id'); // 等同于 $request->param('id')4. file方法
用于获取上传的文件信息,通常与HTML的<input type="file">标签配合使用。
$request->file(); // 获取所有上传文件
$request->file('image'); // 获取名为image的上传文件5. cookie与session
$request->cookie('user_id'); // 获取cookie值
$request->session('token'); // 获取session值四、数据过滤与默认值
为了系统安全性,获取输入数据时必须进行过滤。ThinkPHP5允许在获取数据的同时进行过滤和设置默认值。
1. 设置默认值
当请求的参数不存在时,可以通过第二个参数设置默认返回值,防止程序报错。
$page = $request->param('page', 1); // 如果没有page参数,返回1
$status = $request->get('status', 'all'); // 如果没有status参数,返回all2. 数据过滤
可以在获取参数时直接传入过滤函数,防止XSS攻击或SQL注入等恶意输入。
// 过滤HTML标签
$content = $request->param('content', '', 'htmlspecialchars');
// 强制转换为整数
$id = $request->param('id', 0, 'intval');
// 使用多个过滤函数(用逗号分隔)
$name = $request->param('name', '', 'trim,strip_tags');3. 全局过滤
如果希望对所有输入数据进行统一过滤,可以在应用配置文件中设置全局过滤机制。
// application/config.php 'default_filter' => 'htmlspecialchars',
五、伪静态与路由信息
在RESTful风格的API开发中,经常需要获取路由变量和伪静态后缀。
$request->route(); // 获取所有路由变量
$request->route('id'); // 获取指定的路由变量
$request->dispatch(); // 获取路由调度信息
// 获取当前的伪静态后缀
$request->ext(); // 例如URL为 https://www.ipipp.com/index.html,返回html六、判断请求类型
在很多场景下,根据不同的请求类型执行不同的逻辑(如展示表单页面与处理表单提交)。ThinkPHP5提供了非常便捷的判断方法。
$request->isGet(); // 是否为GET请求 $request->isPost(); // 是否为POST请求 $request->isAjax(); // 是否为AJAX请求 $request->isPjax(); // 是否为PJAX请求 $request->isMobile(); // 是否为手机访问 $request->isDelete(); // 是否为DELETE请求 $request->isPut(); // 是否为PUT请求
也可以使用method方法进行判断:
if ($request->method() == 'POST') {
// 处理POST逻辑
}七、其他实用方法
Request对象还提供了一些辅助方法,用于更精细地控制获取的数据范围。
has:判断参数是否存在。only:获取指定的部分参数,常用于批量插入数据。except:获取排除指定参数外的所有参数,常用于排除不需要的字段(如CSRF令牌)。
// 判断id参数是否存在(支持第二个参数指定来源,如get/post/param)
if ($request->has('id', 'param')) {
// 参数存在时的逻辑
}
// 只获取id和name参数
$data = $request->only('id,name');
// 获取除了content之外的所有参数
$data = $request->except('content');熟练运用上述Request请求对象的方法,不仅能让代码更加简洁优雅,还能有效提升应用的安全性和可维护性。在实际开发中,建议优先使用依赖注入获取Request对象,并养成对输入数据进行过滤和设置默认值的良好习惯。