9.thinkphp的请求

请求对象

当前的请求对象由think\Request类负责,该类不需要单独实例化调用,通常使用依赖注入即可。在其它场合则可以使用think\facade\Request静态类操作。

项目里面应该使用app\Request对象,该对象继承了系统的think\Request对象,但可以增加自定义方法或者覆盖已有方法。项目里面已经在provider.php中进行了定义,所以你仍然可以和之前一样直接使用容器和静态代理操作请求对象。

构造方法注入

一般适用于没有继承系统的控制器类的情况。

<?phpnamespace app\index\controller;use think\Request;class Index 
{/*** @var \think\Request Request实例*/protected $request;/*** 构造方法* @param Request $request Request对象* @access public*/public function __construct(Request $request){$this->request = $request;}public function index(){return $this->request->param('name');}    
}

操作方法注入

另外一种选择是在每个方法中使用依赖注入。

<?phpnamespace app\index\controller;use think\Request;class Index
{public function index(Request $request){return $request->param('name');}    
}

无论是否继承系统的控制器基类,都可以使用操作方法注入。

静态调用

在没有使用依赖注入的场合,可以通过Facade机制来静态调用请求对象的方法(注意use引入的类库区别)。

<?phpnamespace app\index\controller;use think\facade\Request;class Index
{public function index(){return Request::param('name');}    
}

该方法也同样适用于依赖注入无法使用的场合。

助手函数

为了简化调用,系统还提供了request助手函数,可以在任何需要的时候直接调用当前请求对象。

<?phpnamespace app\index\controller;class Index
{public function index(){return request()->param('name');}
}

自定义请求对象

你可以在项目里面自定义Request对象,修改已有的方法或者增加新的方法,默认已经在项目里面为你准备了app\Request类,你只需要直接修改该类就可以为你的项目单独自定义请求对象。

自定义请求对象不支持为多应用的某个应用自定义,只能是全局自定义,如果你需要为某个应用定义不同的请求对象,可以在入口文件里面修改。例如:

// 执行HTTP应用并响应
$request = new app\common\Request();
$http = (new App())->http;
$response = $http->run($request);
$response->send();
$http->end($response);

请求信息

1. Request对象支持全局变量的检测、获取和安全过滤,支持$_GET、$_POST...等;

2. 为了方便演示,这里一律使用Facade的静态调用模式;

3. 使用has()方法,可以检测全局变量是否已经设置:

Request::has('id', 'get');
Request::has('username', 'post');

它是以get的方式不存在,还是以post方式不存在呢?

然后显示以get方式不存在。

如果改成name了呢

就变成了true

4. Request支持的所有变量类型方法,如下表:

5. param()变量方法是自动识别GET、POST等的当前请求,推荐使用;

//获取请求为name的值,过滤
Request::param('name');//获取所有请求的变量,以数组形式,过滤
Request::param();//获取所有请求的变量(原始变量),不包含上传变量,不过滤
Request::param(false);//获取部分变量
Request::param(['name','age']);

怎么取出name的值呢,如下

如果param()不输入指定的值,就是获取所有值。

获取部分值:

6.默认情况下,并没有配置字符过滤器,可在app\Request.php配置;

protected $filter = ['htmlspecialchars'];

设置字符过滤(转义),第二个为什么不转移呢,是由于上面所说的

 //获取所有请求的变量(原始变量),不包含上传变量,不过滤
Request::param(false);

7.如果没有设置字符过滤器,或者局部用别的字符过滤器,可以通过第三参数;

Request::param('name','','htmlspecialchars');Request::param('name','','strip_tags,strtolower');

如果设置了全局过滤器,那么这个局部过滤器就会把全局过滤器给替换掉。

如果两个都想要的话,就加个逗号。

8.如果设置了全局字符过滤器,但又不想某个局部使用,可以只用null参数;

Request::param('name','',null)

9.如果获取不到值,支持请求的变量设置一个默认值;

Request::param('name','默认值');

10.如果采用的是路由URL,也可以获取到变量,但param::get()不支持路由变量;

Request::param('id');Request::route('id');Request::get('id'); //路由参数,get获取不到

使用Request::get("id"),获取不到。

使用Route呢?

就可以获取。

那Request::get("id")可以获取什么呢?只能获取''?''后面的值

(一个就是获取路由的id,一个是获取网址的id)不管哪种id都可以通过param获取。

11.使用only()方法,可以获取指定的变量,也可以设置默认值;

Request::only(['id','name']);Request::only(['id'=>1,'name'=>'默认值']);

12.使用only()方法,默认是param变量,可以在第二参数设置GET、POST等;

Request::only(['id','name'],'post');

13.相反的except()方法,就是排除指定的变量;

Request::except('id,name');Request::except(['id','name']);Request::except(['id'=>1,'name'=>'默认值']);Request::except(['id','name'],'post');

14.使用变量修饰符,可以将参数强制转换成指定的类型;

15./s(字符串)、/d(整型)、/b(布尔)、/a(数组)、/f(浮点);

Request::param('id/d');

14.15传入的age目前只是字符串。

加个/d的话就是强制类型整型。

把网址改成abc之后就会变成0

助手函数

1.为了简化操作,Request对象提供了助手函数;

input('?get.id'); //判断get下的id是否存在
input('?post.name'); //判断post下的name是否存在
input('param.name'); //获取param下的name值
input('param.name', '默认值'); //默认值
input('param.name', '', 'htmlspecialchars'); //过滤器
input('param.id/d'); //设置强制转换

===================================================================

Request对象支持获取当前的请求信息,包括:

方法含义
host当前访问域名或者IP
scheme当前访问协议
port当前访问的端口
remotePort当前请求的REMOTE_PORT
protocol当前请求的SERVER_PROTOCOL
contentType当前请求的CONTENT_TYPE
domain当前包含协议的域名
subDomain当前访问的子域名
panDomain当前访问的泛域名
rootDomain当前访问的根域名
url当前完整URL
baseUrl当前URL(不含QUERY_STRING)
query当前请求的QUERY_STRING参数
baseFile当前执行的文件
rootURL访问根地址
rootUrlURL访问根目录
pathinfo当前请求URL的pathinfo信息(含URL后缀)
ext当前URL的访问后缀
time获取当前请求的时间
type当前请求的资源类型
method当前请求类型
rule当前请求的路由对象实例

对于上面的这些请求方法,一般调用无需任何参数,但某些方法可以传入true参数,表示获取带域名的完整地址,例如:

use think\facade\Request;
// 获取完整URL地址 不带域名
Request::url();
// 获取完整URL地址 包含域名
Request::url(true);
// 获取当前URL(不含QUERY_STRING) 不带域名
Request::baseFile();
// 获取当前URL(不含QUERY_STRING) 包含域名
Request::baseFile(true);
// 获取URL访问根地址 不带域名
Request::root();
// 获取URL访问根地址 包含域名
Request::root(true);

注意domain方法的值本身就包含协议和域名

获取当前控制器/操作

可以通过请求对象获取当前请求的控制器/操作名。

方法含义
controller当前请求的控制器名
action当前请求的操作名

获取当前控制器

Request::controller();

返回的是控制器的驼峰形式(首字母大写),和控制器类名保持一致(不含后缀)。

如果需要返回小写可以使用

Request::controller(true);

如果要返回小写+下划线的方式,可以使用

parse_name(Request::controller());

获取当前操作

Request::action();

返回的是当前操作方法的实际名称,如果需要返回小写可以使用

Request::action(true);

如果要返回小写+下划线的方式,可以使用

parse_name(Request::action());

如果使用了多应用模式,可以通过下面的方法来获取当前应用

app('http')->getName();

输入变量

可以通过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

除了serverenv方法的变量名不区分大小写(会自动转为大写后获取),其它变量名区分大小写。

默认值

获取输入变量的时候,可以支持默认值,例如当URL中不包含$_GET['name']的时候,使用下面的方式输出的结果比较。

Request::get('name'); // 返回值为null
Request::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方法过滤

如果当前不需要进行任何过滤的话,可以使用

// 获取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');

请求类型

1. 有时,我们需要判断Request的请求类型,比如GET、POST等等;

2. 可以使用method()方法来判断当前的请求类型,当然,还有很多专用的请求判断;

判断GET请求:

判断是否为POST请求:

3. 使用普通表单提交,通过method()方法获取类型;

<form action="http://localhost/tp6/public/rely/get" method="post"><input type="text" name="name" value="Lee"><input type="submit" value="提交"></form>return Request::method();

根据这个来POST请求:

使用method方法获取get还是post请求。

 return Request::method();

上面这个图片虽然,method='put',但是识别的还是POST。

4. 在表单提交时,我们也可以设置请求类型伪装,设置隐藏字段_method;

 

根据上面的操作才能变成PUT

5. 而在判断请求,使用method(true)可以获取原始请求,否则获取伪装请求;

<input type="hidden" name="_method" value="PUT">Request::method(true);

6. 如果想更改请求伪装变量类型的名称,可以在app/Request.php中更改;

protected $varMethod = '_m';

7. AJAX/PJAX 伪装,使用?_ajax=1和?_pjax=1,并使用isAjax()和isPjax();

.../rely?_ajax=1Request::isAjax();

8. 这里需要用isAjax()和isPjax()来判断,用method无法判断是否为a(p)jax;

9. 在app.php也可以更改ajax和pjax的名称;

protected $varAjax = '_a';protected $varPjax = '_p';

HTTP头信息

1. 使用header()方法可以输出HTTP头信息,返回是数组类型,也可单信息获取; 

Request::header();Request::header('host');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java从入门到“放弃”(精通)之旅——方法的使用⑤

Java从入门到“放弃”&#xff08;精通&#xff09;之旅&#x1f680;——方法的使用⑤ &#x1f4d6;引言&#xff1a; 在编程领域&#xff0c;代码如同精密的齿轮相互咬合驱动程序运转。随着项目规模渐长&#xff0c;重复的代码片段如同冗余的齿轮&#xff0c;不仅增加负重…

鸿蒙NEXT开发格式化工具类(ArkTs)

import { i18n } from kit.LocalizationKit;/*** 格式化工具类* 提供电话号码格式化、归属地查询、字符转换等功能。* author: 鸿蒙布道师* since: 2025/04/14*/ export class FormatUtil {/*** 判断传入的电话号码格式是否正确。* param phone - 待验证的电话号码* param coun…

[Python基础速成]2-模块与包与OOP

上篇➡️[Python基础速成]1-Python规范与核心语法 目录 Python模块创建模块与导入属性__name__dir()函数标准模块 Python包类类的专有方法 对象继承多态 Python模块 Python 中的模块&#xff08;Module&#xff09;是一个包含 Python 定义和语句的文件&#xff0c;文件名就是模…

OSI参考模型和TCP/IP模型

1.OSI参考模型 OSI模型&#xff1a; OSI参考模型有7层&#xff0c;自下而上依次为物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层。&#xff08;记忆口诀&#xff1a;物联网叔会用&#xff09;。低…

linux Shell编程之循环语句(三)

目录 一. for 循环语句 1. for语句的结构 2. for 语句应用示例 (1) 根据姓名列表批量添加用户 (2) 根据 IP 地址列表检查主机状态 二. 使用 while 循环语句 1. while 语句的结构 2. while 语句应用示例 (1) 批量添加规律编号的用户 (2) 猜价格游戏 三. until 循环语…

最新扣子实战教程,利用扣子平台通过在线表格记录,批量生图,再也不要一条条的粘贴提示词了

1、功能描述 大家好&#xff0c;我是涛涛。今天我要给大家讲解如何在扣子平台上对接飞书电子表格。由于多维表格相对复杂&#xff0c;而很多业务场景其实只需要电子表格就能满足&#xff0c;因此今天我们将演示如何在扣子平台上读取飞书电子表格并批量生成图片。 先看效果&am…

java -jar指定类加载

在 Java 中&#xff0c;使用 java -jar 命令运行 JAR 文件时&#xff0c;默认会加载 JAR 文件的 MANIFEST.MF 文件中指定的 Main-Class。如果你想在运行时指定一个类来加载&#xff0c;可以通过以下方式实现&#xff1a; 方法 1&#xff1a;直接指定类路径和类名 如果你不想使用…

多模态思维链(Multimodal Chain of Thought, MCoT)六大技术支柱在医疗领域的应用

多模态思维链(Multimodal Chain of Thought, MCoT)通过整合文本、图像、视频等多模态数据,结合逻辑推理与深度学习技术,在医疗领域展现出强大的应用潜力。其六大技术支柱在医疗场景中的具体应用如下: 一、推理构建视角:医学诊断的流程优化 MCoT通过多模态推理链生成技术…

从文本到视频:基于扩散模型的AI生成系统全解析(附PyTorch实现)

当语言遇见动态视觉 "用文字生成电影场景"曾是科幻作品中的幻想&#xff0c;如今借助扩散模型&#xff08;Diffusion Models&#xff09;正逐步成为现实。本文将手把手带你实现一个创新的文本到视频生成系统&#xff0c;通过深度解析扩散模型原理&#xff0c;结合独…

科普:如何通过ROC曲线,确定二分类的“理论阈值”

在二分类问题中&#xff0c;已知预测概率&#xff08;如逻辑回归、神经网络输出的概率值&#xff09;时&#xff0c;阈值的选择直接影响分类结果&#xff08;正/负样本判定&#xff09;。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率&#xff1a;适用于样…

2025ArkTS基础UI(一)——Column、Row、Text、Button组件

2025ArkTS基础UI(一)——Column、Row、Text、Button组件 前言 臭宝们&#xff0c;今天我们来学习ArkTS基础UI组件的使用&#xff0c;其中包括&#xff1a; Column、Row、Text、Button组件。 知识点 Colum、Row组件用于布局&#xff0c;Text、Image、Button组件用于展示。 …

强化学习:基于价值的方法做的是回归,基于策略的方法做的是分类,可以这么理解吗?

在强化学习领域,基于价值的方法(Value-based Methods)和基于策略的方法(Policy-based Methods)是两种核心范式。本文将从目标函数、优化机制以及与机器学习任务的类比角度,探讨这两种方法是否可以被分别理解为回归和分类任务,并深入分析其内在逻辑。 一、基于价值的方法…

折叠屏手机:技术进步了,柔性OLED面板测试技术需求跟上了吗?

全球智能手机市场陷入创新焦虑&#xff0c;折叠屏手机被寄予厚望&#xff0c;2023 年出货量同比增长 62%。但在供应链技术狂欢背后&#xff0c;存在诸多问题。消费端数据显示&#xff0c;用户使用频率低&#xff0c;定价策略反常。产业链重构虽让部分企业获利&#xff0c;却推高…

前端在线工具 CodePen 和 JSFiddle

前端在线工具 CodePen 和 JSFiddle CodePen 概述&#xff1a;CodePen 是一个社交化的前端开发环境&#xff0c;用户可以在这里创建代码片段&#xff08;称为“Pens”&#xff09;&#xff0c;分享和展示自己的前端开发作品。 主要功能&#xff1a; 实时预览&#xff1a;用户在…

Redis-场景缓存+秒杀+管道+消息队列

缓存一致性 1.两次更新 先更新数据库&#xff0c;再更新缓存&#xff1b;先更新缓存&#xff0c;再更新数据库&#xff1b; 出现不一致问题场景&#xff1a; 先更新数据库&#xff0c;再更新缓存&#xff1b; 先更新缓存&#xff0c;再更新数据库&#xff1b; 两次更新的适…

[Windows] 字体渲染 mactype v2025.4.11

[Windows] 字体渲染 mactype 链接&#xff1a;https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可变字体支持已到来。 本版本将可变字体支持扩展到所有 GDI 应用程序。 所有 win32 程序中的字体&#xff0c;如 Noto Sans、Se…

【C++】深拷贝与浅拷贝

重开也不是不可能 ~.~ 浅拷贝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 构造函数&#xff0c;初始化指针成员ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…

SpringBoot企业级开发之【用户模块-更新用户头像】

功能如下所示&#xff1a; 我们先看一下接口文档&#xff1a; 为什么头像是一串字符串呢&#xff1f;因为我们是将头像图片放到第三方去存储&#xff0c;比如&#xff1a;阿里云等 开发思路&#xff1a; 实操&#xff1a; 1.controller 注意!这里使用【PatchMapping】注解…

vue3+vite+js项目引入electron构建跨平台桌面应用

1.准备工作 ① 必要安装node.js、vue、vite、electron、pnpm 本人用的node版本v18.17.1、vue版本^3.4.19、vite版本^3.2.7、electron版本^35.1.4 ② 开发调试打包安装 "devDependencies": {"concurrently": "^9.1.2","electron-builder&…

(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)

前言&#xff1a; 今天有两个项目&#xff0c;分别为&#xff1a; 串口接收: 串口发送&#xff1a; 如上图将文件放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的可以去看江科大的视频&#xff1a; 【51单片机入门…