当前位置: 首页 > news >正文

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.mrgr.cn/news/98347.html

相关文章:

  • 【STL】set
  • 【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现
  • 前端工程化之自动化构建
  • 07软件测试需求分析案例-修改用户信息
  • UNITY 屏幕UI自适应
  • 使用SVM对心脏数据是否患病进行分类预测
  • UNet深度学习实战遥感航拍图像语义分割
  • 科研软件分享
  • deepin使用autokey添加微信快捷键一键显隐ctrl+alt+w
  • Linux内核中struct net_protocol的early_demux字段解析
  • HarmonyOS 第2章 Ability的开发,鸿蒙HarmonyOS 应用开发入门
  • 7.thinkphp的路由
  • 观察者模式(行为模式)
  • Activiti(六)- 启动、挂起、激活,查询及删除流程实例
  • 关于 驱动开发方法 的详细分类、核心特点及对比分析,涵盖 TDD、MDD、BDD、DDD、ATDD、FDD、PDD 等主流方法
  • EMMOE:开放环境中具身移动操控的综合基准
  • C 语言中经典的数据结构
  • 【数据结构_5】链表(模拟实现以及leetcode上链表相关的题目)
  • 一种基于学习的多尺度方法及其在非弹性碰撞问题中的应用·
  • 【深度学习】PyTorch实现VGG16模型及网络层数学原理