下面给你一份 ThinkPHP5 中 Request 请求对象最完整实战大全(含常用方法 + 进阶用法 + 安全注意点)。
一、Request 对象是什么?
在 ThinkPHP 5 中,Request 是用于获取:
- GET / POST 参数
- 路由参数
- 请求类型
- 请求头
- IP 地址
- 域名
- 文件上传
- JSON 数据
- 服务器环境变量
的核心对象。
二、获取 Request 实例
方法 1:控制器中自动注入(推荐)
use think\Request;
public function index(Request $request)
{
dump($request->param());
}
方法 2:静态方式
$request = request();
三、获取请求参数
1️⃣ 获取所有参数
$request->param();
等价于:
input();
2️⃣ 获取 GET 参数
$request->get();
$request->get('id');
指定默认值:
$request->get('id', 0);
3️⃣ 获取 POST 参数
$request->post();
$request->post('username');
4️⃣ 获取路由参数
$request->route();
$request->route('id');
5️⃣ 获取 PUT / DELETE
$request->put();
$request->delete();
6️⃣ 只获取指定字段
$request->only(['id','name']);
排除字段:
$request->except(['password']);
四、参数过滤与类型转换(重点)
1️⃣ 强制类型转换
$request->param('id/d');
常用类型:
| 类型 | 写法 |
|---|---|
| int | /d |
| float | /f |
| string | /s |
| bool | /b |
例子:
$id = $request->param('id/d', 0);
2️⃣ 过滤 HTML
$request->param('name','','htmlspecialchars');
3️⃣ 全局过滤
config.php:
'default_filter' => 'htmlspecialchars'
五、判断请求类型
判断是否 POST
$request->isPost();
判断是否 GET
$request->isGet();
判断是否 AJAX
$request->isAjax();
判断是否 HTTPS
$request->isSsl();
六、获取请求信息
获取 IP
$request->ip();
获取域名
$request->domain();
获取当前 URL
$request->url();
带域名:
$request->url(true);
获取当前模块 / 控制器 / 方法
$request->module();
$request->controller();
$request->action();
七、获取 Header 信息
获取所有 Header
$request->header();
获取指定 Header
$request->header('User-Agent');
八、获取原始请求内容
获取 raw 数据
$request->getContent();
用于处理 JSON:
$data = json_decode($request->getContent(), true);
九、文件上传
获取上传文件
$file = $request->file('image');
保存文件
$file->move(ROOT_PATH . 'public/uploads');
多文件上传
$files = $request->file('images');
foreach ($files as $file) {
$file->move(...);
}
十、JSON 请求处理
当前端发送:
{
"name":"小明",
"age":18
}
处理方式:
$data = json_decode($request->getContent(), true);
十一、获取服务器环境变量
$request->server();
$request->server('HTTP_HOST');
十二、获取 Cookie
$request->cookie();
$request->cookie('token');
十三、获取 Session
session('user_id');
或:
$request->session('user_id');
十四、参数优先级规则
param() 的优先级:
route > GET > POST
十五、安全建议(生产必须)
✅ 永远不要直接信任 param()
错误:
$id = $request->param('id');
正确:
$id = $request->param('id/d', 0);
✅ 过滤 XSS
htmlspecialchars
✅ 验证器配合使用
validate([
'id' => 'require|number',
])->check($request->param());
十六、完整示例控制器
use think\Controller;
use think\Request;
class User extends Controller
{
public function save(Request $request)
{
if (!$request->isPost()) {
return json(['error'=>'Invalid request']);
}
$data = $request->only(['name','age']);
$data['age'] = $request->param('age/d');
return json([
'ip' => $request->ip(),
'data' => $data
]);
}
}
十七、常见问题
param() 和 input() 区别?
本质一样,input() 是助手函数。
为什么获取不到 JSON?
必须用:
$request->getContent();
为什么 Ajax 判断失败?
检查 Header:
X-Requested-With
十八、总结结构图
Request 可获取:
参数类
请求类型
请求头
IP / 域名
文件
JSON
环境变量
如果你需要
我可以给你:
- 🔥 ThinkPHP5 全局安全加固方案
- 🔥 TP5 + JWT 接口封装标准模板
- 🔥 企业级 API 统一响应结构
- 🔥 TP5 与 TP6 区别对照表
你现在是做 API 还是传统页面?我可以给你针对性最佳实践方案。
发表回复