工学1号馆

home

« | 返回首页 | »

ThinkPHP5.0快速入门--请求(Request)

By Wu Yudong on November 10, 2017

ThinkPHP5 的架构设计和之前版本的主要区别之一就在于增加了 Request 请求对象和 Response 响应对象的概念,了解了这两个对象的作用和用法对你的应用开发非常关键。

请求对象

Request 对象的作用是与客户端交互,收集客户端的Form、 Cookies、 超链接,或者收集服务器端的环境变量。

Request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。 客户端可通过HTML表单或在网页地址后面提供参数的方法提交数据,然后通过Request对象的相关方法来获取这些数据。 Request的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。

ThinkPHP5 Request 对象由 think\Request 类完成。

Request 对象的一个主要职责是统一和更安全地获取当前的请求信息,你需要避免直接操作 $_GET $_POST $_REQUEST $_SESSION $_COOKIE ,甚至 $_FILES 等全局变量,而是统一使用Request 对象提供的方法来获取请求变量。

下面来举一个最简单的例子(获取当前访问的url地址)来说明在不同的情况下如何调用 Request 对象。传统方式调用
该用法主要是用来告诉大家 Request 对象是如何实例化的,因为实际开发中很少选择这种方式调用。

use think\Request;

class Index {
	public function hello($name = 'World') {
		$request = Request::instance ();
		// 获取当前URL地址 不含域名
		echo 'url: ' . $request->url () . '<br\>';
		return 'Hello,' . $name . '!';
	}
}

输入如下地址:http://tp5.com/index/index/hello.html?name=wuyudong

页面显示如下结果:

url: /index/index/hello.html?name=wuyudong
Hello,wuyudong!

继承think\Controller

如果控制器类继承了 think\Controller 的话,可以做如下简化调用:

use think\Controller;
class Index extends Controller{
	public function hello($name = 'World') {
		// 获取当前URL地址 不含域名
		echo 'url: ' . $this->request->url () . '<br/>';
		return 'Hello,' . $name . '!';
	}
}

自动注入请求对象

如果没有继承 think\Controller ,则可以使用 Request 对象注入的方式来简化调用:

use think\Request;
class Index {
	public function hello(Request $request, $name = 'World') {
		// 获取当前URL地址 不含域名
		echo 'url: ' . $request->url () . '<br/>';
		return 'Hello,' . $name . '!';
	}
}

提示: hello方法的request参数是系统自动注入的,而不需要通过URL请求传入。

使用助手函数

如果既没有继承 think\Controller 也不想给操作方法添加额外的 Request 对象参数,那么也可以使用系统提供的助手,例如:

class Index {
	public function hello($name = 'World') {
		// 获取当前URL地址 不含域名
		echo 'url: ' . request()->url () . '<br/>';
		return 'Hello,' . $name . '!';
	}
}

接下来陆续了解下请求对象的常用方法。

获取请求变量

系统推荐使用 param 方法统一获取当前请求变量,该方法最大的优势是让你不需要区分当前请求类型而使用
不同的全局变量或者方法,并且可以满足大部分的参数需求,下面举一个例子。

use think\Request;
class Index {
	public function hello(Request $request) {
		echo '请求参数:';
		dump($request->param());
		echo 'name:'.$request->param('name');
	}
}

访问下面的URL地址:

http://tp5.com/index/index/hello.html?test=wu&name=wuyudong

页面输出结果为:

请求参数:
array(2) {
["test"] => string(2) "wu"
["name"] => string(8) "wuyudong"
}
name:wuyudong

系统提供了一个input助手函数来简化 Request 对象的param方法,用法如下:

class Index {
	public function hello() {
		echo '请求参数:';
		dump(input());
		echo 'name:'.input('name');
	}
}

param 方法获取的参数会自动判断当前的请求,以 POST 请求为例的话,参数的优先级别为:

路由变量 > 当前请求变量($_POST变量) > $_GET变量

注意: 这里的路由变量指的是路由规则里面定义的变量或者 PATH_INFO 地址中的变量。 路由变量无法使用
get 方法或者 $_GET 变量获取。

param 方法支持变量的过滤和默认值,例如:

use think\Request;
class Index {
	public function hello(Request $request) {
		echo 'name:' . $request->param ( 'name', 'World', 'strtolower' );
		echo '<br/>test:' . $request->param ( 'test', 'thinkphp', 'strtoupper' );
	}
}

访问下面的URL地址:

http://tp5.com/index/index/hello.html?test=wu&name=wuyudong

页面输出结果为:

name:wuyudong
test:WU

除了 Param 方法之外, Request 对象也可以用于获取其它的输入参数,例如:

use think\Request;
class Index {
	public function hello(Request $request) {
		echo 'GET参数:';
		dump($request->get());
		echo 'GET参数:name';
		dump($request->get('name'));
		echo 'POST参数:name';
		dump($request->post('name'));
		echo 'cookie参数:name';
		dump($request->cookie('name'));
		echo '上传文件信息:image';
		dump($request->file('image'));
		
	}
}

页面输出的结果为:

GET参数:

array(2) {
  ["test"] => string(2) "wu"
  ["name"] => string(8) "wuyudong"
}

GET参数:name

string(8) "wuyudong"

POST参数:name

NULL

cookie参数:name

NULL

上传文件信息:image

NULL

还可以获取请求参数、URL信息、 当前模块/控制器/操作信息 、 路由和调度信息,这里就不一一赘述了,详情可以查手册

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)