4.1 Request:请求对象 + 请求信息 + 获取变量 + 请求类型

 

请求类由 think\Request类负责
不需要单独实例化调用 通常依赖注入就可以
其他场合则使用 think\facade\Request静态调用

 

一 请求对象

//1、依赖注入
<?php
namespace app\admin\controller;
use think\Request;
class Demo
{
    public function index(Request $request){
        return $request->param('name');
    }
}
//2 构造函数传入 <?php namespace app\admin\controller; use think\Request; class Demo { public $request; public function __construct(Request $request) { $this->request = $request; } public function get(){ return $this->request->param('name'); } } //3 门面模式调用 ( 常用 ) <?php namespace app\admin\controller; use think\facade\Request; class Demo { public function demo(){ return \think\facade\Request::param('name'); return Request::param('name'); } } //4 助手函数( 简介常用 ) <?php namespace app\admin\controller; class Demo { public function demo(){ return request()->param('name'); } }

三四最常用 方便优雅

二 请求信息

1)常用方法

都是方法 非属性
http://www.blog.com/admin/demo/demo?id=5

host(); 当前访问域名或者IP  www.blog.com

scheme(); 当前访问协议  http

port() 当前访问的端口   80

remotePort 当前请求的REMOTE_PORT 远程端口  50671
protocol 当前请求的SERVER_PROTOCOL HTTP协议版本 HTTP/1.1 contentType 当前请求的CONTENT_TYPE Content-Type domain 当前包含协议的域名 http://www.blog.com subDomain 当前访问的子域名 www panDomain 当前访问的泛域名 rootDomain 当前访问的根域名 blog.com url 当前完整URL /admin/demo/demo?id=5 baseUrl 当前URL(不含QUERY_STRING) /admin/demo/demo query 当前请求的QUERY_STRING参数 s=//admin/demo/demo&id=5 baseFile 当前执行的文件 /index.php root URL访问根地址 /admin rootUrl URL访问根目录 /admin pathinfo 当前请求URL的pathinfo信息(含URL 后缀) demo/demo ext 当前URL的访问后缀 time 获取当前请求的时间 1610022678 type 当前请求的资源类型 xml method 当前请求类型 GET rule 当前请求的路由对象实例

  2)个别可以加 true 的方法

Request::url(true);       http://www.blog.com/admin/demo/demo?id=5  //返回完整url

Request::baseFile(true);  http://www.blog.com/index.php    //获取当前URL(不含QUERY_STRING) 包含域名

Request::root(true);      http://www.blog.com/admin   //获取URL访问根地址 包含域名

 3)获取模块 控制器 方法名

//1 返回多应用下的 模块名
app('http')->getName();

//2 返回控制器名
Request::controller();  //返回控制器名 驼峰形式
Request::controller(true);  //返回控制器名 小写形式
parse_name(Request::controller()); //返回小写 + 下划线

//3 返回方法名
Request::action();  //驼峰格式
Request::action(true);  //小写格式
parse_name(Request::action()); //小写 + 下划线

 

 三 获取输入变量

前置知识

//1 基础语法
变量类型方法('变量名/变量修饰符','默认值','过滤方法')
//功能介绍 通过Request类 完成全局变量的检测、获取和安全过滤。支持的方法: $_GET 、 $_POST 、$_REQUEST 、 $_SERVER 、 $_SESSION 、 $_COOKIE 、 $_ENV 等系统变量,以及文件上传信息。

1)检测变量是否设置

$res = Request::has('id','get'); //返回布尔值
$res = Request::has('name','post'); //返回布尔值

变量检测可以支持所有支持的系统变量,包括以下
get/post/put/request/cookie/server/session/env/file

 

2)变量获取

//支持的13个方法

param 获取当前请求的变量
get 获取 $_GET 变量 post 获取 $_POST 变量 put 获取 PUT 变量 delete 获取 DELETE 变量 session 获取 SESSION 变量 cookie 获取 $_COOKIE 变量 request 获取 $_REQUEST 变量 server 获取 $_SERVER 变量 env 获取 $_ENV 变量 route 获取 路由(包括PATHINFO) 变量 file 获取 $_FILES 变量 middleware 获取 中间件赋值/传递的变量

 param方法自动识别当前请求 [ 系统推荐的方式 ]

//1 获取当前请求的 name 变量
return Request::param('name');//返回字符串

//2 获取当前请求的所有变量( 经过过滤 )
return Request::param();//返回一维数组

//3 获取当前请求的所有变量( 未经过滤 )
return Request::param(false);//返回一维数组
//4 获取当前请求的部分变量
Request::param(['id','name']);//返回一维数组

param 方法会把当前请求类型的参数和路由变量以及GET请求合并,并且路由变量是优先的。

 使用注意点

//1、路由变量的获取
例如当访问地址是 http://localhost/index.php/index/index/hello/name/thinkphp echo Request::get('name'); //错误用法 get方法获取不到路由变量 输出为空 echo Request::param('name'); //正确用法 可以用param方法获取 输出thinkphp //2、大小写
除了 server 和 env 方法的变量名不区分大小写(会自动转为大写后获取),其它变量名区分大小写。

3)默认值

第二个参数传入默认值

return Request::param('id');//id没有值  输出NULL

return Request::param('id','');//id没有值  输出空

return Request::param('id','没有id值');//id没有值  输出:没有id值

4)变量过滤

//1、设置全局变量规则:
用的时候看文档
//2、获取变量的时候过滤 return Request::param('id','没有id值','htmlspecialchars,strip_tags');//第三个参数传入过滤方法 多个方法用逗号分隔
//3、不进行任何过滤 即使设置了全局变量 return Request::param('id','没有id值','null');//第三个参数传入null

对于body中提交的 json 对象,你无需使用 php://input 去获取,可以直接当做表单提交的数据使 用,因为系统已经自动处理过了 

  5)获取部分变量 only()

//1 获取一个变量
Request::only(['id']);//参数必须为数组
//2 获取多个变量 Request::only(['id','name']);//返回一维数组 //3 获取多个变量 并指定获取类型 Request::only(['id','name'],'get');//第二个参数默认是 param 方法
//4 批量设置默认值 Request::only(['id'=>0,'name'=>'名字为空']); //5 排除某些变量 Request::except(['id','name']);//排除id和name变量
//6 排除某些变量 并指定获取类型 Request::except(['id','name'],'get');

采用 only 方法能够安全的获取你需要的变量,避免额外变量影响数据处理和写入。

6)变量修饰符

s  强制转换为字符串类型

d 强制转换为整型类型

b 强制转换为布尔类型

a 强制转换为数组类型

f 强制转换为浮点类型
//使用范例
Request::get('id/d');
Request::post('name/s');
Request::post('ids/a');

7)中间件变量

中间件的时候再补充

8)助手函数 input() 

//1 判断变量是否定义
input(?get.id);
input(?post.name);

//2 获取param参数
input('param.id'); = input('name'); //获取单个参数
input('param.'); = input('');   //获取全部参数

//3 获取get参数
input('get.id')//返回字符串
input('get.name');//使用过滤方法获取 默认为字符串
input('get.')//返回数组

//4 使用过滤方法
input('get.name','默认值','过滤方法')

//5 使用变量修饰符
  input('get.id/d');  input('post.name/s');  input('post.ids/a');

 

 四 请求类型

很多情况下,我们需要判断当前请求类型是 GET、POST、PUT、DELETE或者 HEAD ,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求

没有必要在控制器中判断请求类型来执行不同的逻辑,完全可以在路由中进行设置。
所有的方法 都不需要传入参数。

获取当前请求类型 method 返回的始终是大写

判断是否GET请求 isGet

判断是否POST请求 isPost

判断是否PUT请求 isPut

判断是否DELETE请求 isDelete

判断是否AJAX请求 isAjax

判断是否PJAX请求 isPjax

判断是否JSON请求 isJson

判断是否手机访问 isMobile

判断是否HEAD请求 isHead

判断是否PATCH请求 isPatch

判断是否OPTIONS请求 isOptions

判断是否为CLI执行 isCli

判断是否为CGI模式 isCgi

请求类型伪装

暂时用不到 回头在补充

 

 

 

 

posted @ 2021-01-11 20:29  棉花糖88  阅读(607)  评论(0)    收藏  举报