今天这篇文章主要写一下tp5.0的请求(request)
和响应(response)
。关于更多TP5.0的内容请参见[我的博客列表]
ThinkPHP5 的架构设计和之前版本的主要区别之一就在于增加了 Request 请求对象和 Response 响应对
象的概念,了解了这两个对象的作用和用法对你的应用开发非常关键。
请求对象
Request 对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环
境变量。Request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可通过
HTML表单或在网页地址后面提供参数的方法提交数据,然后通过Request对象的相关方法来获取这些数
据。Request的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。Request 对象的一个主要职责是统一和更安全地获取当前的请求信息。本着不相信用户输入的一切内容的原则,我们应该尽量避免直接使用:
$_GET、$_POST、$_COOKIE、$_SESSION
等全局变量。
调用方式
/**
* @param Request $request 使用自动注入的方式需要用到的参数
*/
public function request_demo(Request $request)
{
/****传统用法 use think\Request ****/
//通过实例化获取 url 不含域名
//$url = Request::instance() -> url();
/*继承 think\Controller 可以使用的方法*/
//通过继承父类获取 url 不含域名
//$url = $this -> request -> url();
/***自动注入请求对象***/
//在没有继承think\controller的情况下 use think\Request后 使用 Request 对象注入的方式来简化调用
// ! 此方法的request参数是系统自动注入的,而不需要通过URL请求传入
$url = $request -> url();
/***使用助手函数获取***/
//$url = request() -> url();
// ! 另有 动态绑定属性的方法 获取 不再赘述 , 如有意向请留言 或自行参考官方快速入门手册第三章:请求和相应
//输出请求地址
echo $url;
}
上面任意一种方式都可以调用当前请求的 Request 对象实例,然后通过请求对象实例的方法来完成不同的
信息获取或者设置。
获取请求变量
public function login(Request $request)
{
//根据请求类型响应
if ($request -> isGet()){
//渲染模板
return $this -> fetch();
}elseif ($request -> isPost()){
//获取方式有很多种:
// 1、 $ this -> param(); param 支持变量过滤和默认值 并且会自动判断当前请求 参数优先级为 路由变量>post变量>get * ! 这里的路由变量指的是路由规则里面定义的变量或者 PATH_INFO 地址中的变量。路由变量无法使用get 方法或者 $_GET 变量获取。
// 2、 助手函数 input(); param 的简化版 类似于 3.2版本的 I() 方法 可获取get,post,cookie,file,delete,request,env,server…… 除了file方法外 其他方法都支持过滤和默认值操作
// 3、 使用 request 对象获取
//使用request 对象获取 post 参数
//$param = $request -> post();
}else{
return '非法请求';
}
}
tp5.0默认没有过滤, 可以设置全局过滤方法,如下:
// 默认全局过滤方法 用逗号分隔多个 默认无过滤 自己设定为 htmlspecialchars 方法过滤
'default_filter' => 'htmlspecialchars',
归纳如下
除了file方法外其他方法都支持默认值和过滤方法
获取请求参数&url信息
/**
* Effect : 获取当前请求参数
* @param Request $request 自动注入请求对象
*/
public function get_param(Request $request)
{
//获取请求参数
echo '请求方法:' . $request->method() . '<br/>';
echo '资源类型:' . $request->type() . '<br/>';
echo '访问IP:' . $request->ip() . '<br/>';
//var_export();输出或返回一个变量的字符串表示描述 详情参见PHP手册
echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
echo '请求参数:';
dump($request->param());
echo '请求参数:仅包含tel';
dump($request->only(['tel']));
echo '请求参数:排除tel';
dump($request->except(['tel']));
}
/**
* Effect : 获取当前url信息
* @param Request $request 自动注入请求对象
*/
public function get_url(Request $request)
{
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root: ' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';
}
归纳如下
url、baseUrl、baseFile、root方法如果传入true,表示获取包含域名的地址
获取当前模块、控制器和操作的信息 &获取路由调度信息
public function get_url(Request $request)
{
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root: ' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';
echo '路由信息:';
dump($request->route());
//模块,控制器,方法
echo '调度信息:';
dump($request->dispatch());
}
响应对象
Response 对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应。通常用于输出
数据给客户端或者浏览器。ThinkPHP5 的 Response 响应对象由 think\Response 类或者子类完成。
自动输出
大多数情况,我们不需要关注 Response 对象本身,只需要在控制器的操作方法中返回数据即可,系统会根据
default_return_type
和default_ajax_return
配置决定响应输出的类型。默认的自动响应输出会自动判断是否 AJAX 请求,如果是的话会自动输出
default_ajax_return
配置的
输出类型。默认的输出类型为 Html
我们可以通过修改配置文件改变默认的输出类型。例如修改为输出
json
:
// 默认输出类型
'default_return_type' => 'json',
手动输出
在必要的时候,可以手动控制输出类型和参数,这种方式较为灵活。如果需要指定输出类型,可以通过下面的方式:
public function hello()
{
$data = ['name' => 'thinkphp', 'status' => '1'];
return json($data);
}
这样的话无论配置参数如何, 都会输出json
格式的数据
默认的情况下发送的http状态码是 200 ,如果需要返回其它的状态码,可以使用:
public function hello()
{
$data = ['name' => 'thinkphp', 'status' => '1'];
return json($data, 201);
}
或者发送更多的响应头信息:
public function hello()
{
$data = ['name' => 'thinkphp', 'status' => '1'];
return json($data, 201, ['Cache-control' => 'no-cache,must-revalidate']);
}
也支持使用下面的方式:
public function hello()
{
$data = ['name' => 'thinkphp', 'status' => '1'];
return json($data) -> code(201) -> header(['Cache-control' => 'no-cache,must-revalidate']);
}
页面跳转
如果需要进行一些简单的页面操作提示或者重定向,可以引入
traits\controller\Jump
,就可以使用相关页面跳转和重定向方法,下面举一个简单的例子,当页面传入name参数为thinkphp的时候,跳转到欢迎页面,其它情况则跳转到一个guest页面。如果你的控制器类是继承的
\think\Controller
的话,系统已经自动为你引入traits\controller\Jump
,无需再次引入。
public function index($name='')
{
if ('thinkphp' == $name) {
$this->success('欢迎使用ThinkPHP5.0','hello');
} else {
$this->error('错误的name','guest');
}
public function hello()
{
return 'Hello,ThinkPHP!';
}
public function guest()
{
return 'Hello,Guest!';
}
页面重定向
//重定向页面至百度 无需return
$this->redirect('http://baidu.com');
redirect 方法默认使用 302 跳转,如不需要可以使用第二个参数进行301跳转。
在任何时候(即使没有引入Jump trait的话),我们可以使用系统提供的助手函数redirect函数进行重定向。
return redirect('http://baidu.com');
更多相关知识请参见[文章列表]
return redirect('http://baidu.com', 302);
更多相关知识请参见[文章列表]