您的位置:首页 > 编程语言 > PHP开发

《TP5.0学习笔记---请求和响应篇》

2017-07-14 09:28 99 查看
请求对象Request
我们知道Thinkphp是一个单入口的框架,所有的请求都进入index.php,我们通过index.php来接收所有的http请求,那么请求中所有的参数,我们都可以同过Request这个对象来接收和处理。

在thinkphp中我们又三种方法可以让我们获得Request对象

第一种方式:是框架提供的一个助手函数request()



第二种方式:是通过think下的Request类来获取它的实例



第三种方式:直接注入Request对象(看截图)



我们知道Thinkphp是一个单入口的框架,所有的请求都进入index.php,我们通过index.php来接收所有的http请求。那么我们现在打开这个index.php



在前边的学习我们知道,index.php只要定义一些常量以及引入框架的引导文件就可以了,这里引入了thinkphp/start.php,现在我们打开start.php



这里直接执行了App下的run()方法,它返回的是Response对象,它会执行Response下的send()方法,来返回给我们当前的http请求,在这里,它先引入了一个base.php,之前我们了解到base.php是定义的一些常量以及一些初始化。我们看见它把当前的文件命名为think(也就是当前的命名空间为think,也就是这里的namespace think),所以我们的App也是在think这个命名空间下。这个think指的是thinkphp/library/think

我们会看见有一个App.php,我们知道类名要和文件名相同



这个文件的命名空间也是think。

这个run()方法默认传递的就是一个request对象,默认值为null

看一下第一行,如果request为空,它就会执行Request类下的instance()方法来实例化一个request对象。Request是一个单例模式的类,也就是我们在整个应用中,只能实例化一次,在我们的App下的run()中就进行了实例化,那么我们在以后所有的方法中都可以使用。

从这整个过程我们知道,最先执行的就是App下的run()方法,我们的request对象在我们的run()方法中就已经实例化好了,我们可以在后面进行使用。

 

能在我们的request对象获取什么呢?

1,  获取浏览器输入框的值

比如说我们现在要获取我们的域名



如何获取后边的控制器名及方法名呢?

那就是pathinfo()方法



2,  通过request对象获取请求类型



快速判断是那种请求的函数,如:

$request->isGet();

$request->isPost();

$request->isAjax();

3,  如何获取请求参数



在thinkphp5.0开始,他所有的get不包含pathinfo中的传值

要想获取,可以使用$request->param()



获取post值就是$request->post()

获取session中的值$request->session()

我的浏览器中还没存过session值,这里我想设置一个

注意:我们如果想启用session,需要修改session的配置,在convention.php中找到,然后复制到应用配置文件config.php中

之后我再回到浏览器刷新,我设置的session就会出来,看图



还可以获取cookie,$request->cookie();

因为我们启用了session,它默认会有一个cookie

我们也可以自己添加cookie



这些我们获取的都是数组,如果我们想获取到数组下的某一个值,该如何获取呢?

比如这样



别的获取数组中的某一个也是这样,比如cookie  $request->cookie(‘email’);

4,获取模块  控制器   操作

在我们编写一些权限控制的时候,经常会用到权限控制器和操作,通过第三个选项共同来验证当前模块是否有权限,所以在我们的应用中,或者在我们的控制器中,我们也经常使用这些方式来进行获取

(1)      获取当前模块

$request->module();

(2)      获取当前控制器

$request->controller();

(3)      获取当前操作名

$request->action();



如果我们还想看request对象还为我们提供了哪些方法,我们可以打开thinkphp/library/think/Request.php

比如说我们看见里边还有url()方法,我们就可以试一下



助手函数input
在我们的程序开发过程中获取参数是十分重要的,所以thinkphp为我们提供了一个助手函数,叫input

我们可以通过input来获取我们传递的各种参数。我们知道thinkphp5.0框架的助手函数都在thinkphp/helper.php文件中,我们可以找到input函数



我们会看到它首先有一个判断,判断当前系统是
4000
否存在input 函数,如果存在,它就会跳过该部分,不再定义input函数。我们知道在php中,如果我们将一个函数重新定义,那么程序是会报错的,所以我们使用input函数是有一定风险的。我们在执行框架之前,也就是说我们在入口文件的地方,如果我们引入其他的文件,我们在其他文件中定义了input这个函数,那么系统将无法使用input这个函数来获取我们的各种参数,它还是使用我们自定义的那个input值。当然,在我们使用框架的时候,我们规范中是不允许重新定义的,或者说,我们团队中应该有这样的规范,不能定义和我们系统助手函数相同的函数名,如果定义的话,如果在之前引入,那系统中的函数将不能使用,如果在之后使用,那么程序会报错。

 

下面我们来看一下input函数的具体实现

Input函数有三个参数,第一个是$key,是我们要获取的变量名,第二个值为$default,如果我们要获取某一个变量,但是这个变量在系统中并不存在,它将直接返回我们的$default值。第三个参数为$filter,我们获取我们的变量值,那么我们是需要进行过滤的。如果你需要对变量的值进行过滤,那么你可以传递第三个参数来进行过滤,它接收的是一个函数名。然后接着看下边的代码



如果我们的$key值第一位是‘?’,也就是说,我们传入进来的$key值以“?”开头,那么他将直接把“?”去掉,并将$has值设置为true.(这里的strpos()函数作用是找到某个字符或字符串,第一次出现的位置)

接下来的那个if判断,如果$key值存在‘.’这个符号,那么它直接将用‘.’进行分割,将我们的$key分割成两个变量。后边的代码很好理解,自己看一下

 

我们在index/Index/index下打印一下$request->param()

会看见typy和id,type是通过pathinfo传递的,id是通过get传递的



需要说明一点,在我们使用param()这个方法中进行获取,它会返回我们post,get,以及我们pathinfo传递的所有值,也就是说,如果我们获取到了get值,它也会默认合并到我们的param中。

 

下面说一种情况,如果我们的get中存在id,post中也传入一个id,这个时候打印出param()的值,仅为两位,这个时候param中的id的值是post传递过来的值。所以这样给我们的程序在编写或者在后期的维护过程中,会出现很多问题,同样的取值,同样的方式,它取得的值却不是同一个地方的值。如果我们想解决这个问题,我们可以在前边加上取值的类型(例如:input(‘post.id’)),其实这对应的就是$resquest->get(‘id’);如果我们获取的是一个不存在的值,则会返回NULL,如果我们想给它一个默认值,我们就可以再给添加一个参数

作为默认值



现在如果我们想对sid进行过滤,比如说,需要传递sid为一个整形的时候,我们可能需要对他进行一个强制类型转化,此时我们可以传递第三个参数,叫’intval’,在php中就是转为整形的意思

Input()可以获取到哪些类型的额数据呢?

有:post,get,param,session,put,file,path等等,其实我们在刚才的助手函数中就可以看到它可以获取哪些类型的数据



如果传递的email不存在,我们依然可以添加第二个参数作为默认值input(‘session.email’,’3404767031@qq.com’);



响应对象Response
我们只带http请求是,每个请求会对应一个响应,我们的额服务器会对我们的请求作出相应的响应,我们可以在请求中获取所有的请求信息,那么我们该如何来控制我们的响应呢?thinkphp为我们提供了响应对象,我们这里不对响应对象做过详细的讲解,我们通过调整一些简单的参数,来让我们的response或者来让我们的程序返回不同的结果。比如说我们现在为App开发接口,那么我们可能需要的响应对象是一个Json或者是一个xml,如果现在我们是一个Ajax请求,那么我们肯能期望的响应是Json或xml以及html格式.如果我们现在做一个企业官网,那么我们可能只期望我们的响应对象是一个html就可以了。

现在看下边的代码,我在index/Index/index下定义一个数组



我们会在浏览器中得到一个html格式的结果,说明我们当前的响应为一个html响应。

其实在这个我们是不期望用echo 打印东西的,还有不用die()这些东西。因为我们的控制器最终会返回一个值,这个值需要在我们的response对象中进行处理,如果我们直接用die(),我们的程序是没有任何的问题,但是我们的响应就会发生一些问题。所以在我们的thinkphp5中,它不允许我们在程序中直接用die()。我们可以通过return的方式进行返回

 

我们来看一下是什么控制了我们的输出类型呢?

还是打开框架的convention.php,找到



然后你看我下边的代码



我们我们想将输出格式改成xml格式,就可以将json改成xml

 

那这些有什么用处呢?我们来举一个实际应用的例子

 

比如说我们现在需要给我们的api写接口,我们可能在我们的app目录下,直接新建一个模块叫api

我在里边写了一个Index.php文件



现在我们直接访问这个api/Index/getUser()方法,会报错。报错说我们的当前类型是array类型。我们期望返回的是一个html,html我们返回的应该是一个字符串,但我们当前返回的是数组,所以它无法解析会报错。我们可以通过改变它的类型,可以在conf下创建api/config.php这个配置文件,在前边讲过,在conf下创建与模块名相同的文件夹下为配置文件,仅对改模块起作用。同时我们也可以使用一个简单的方法进行配置,就是直接在改控制器下用Config::set()进行动态配置

在我们最终使用的时候一般不使用添加配置文件这种方式,因为在我们修改配置文件的时候,将Json修改成了xml时,那么所有的接口都会变成xml,那么我们已经发布的app可能就会存在问题。所以我们一般再给getUser()函数传递一个$type参数,让其默认值为Json,然后我们再在函数体中进行判断,最后我们使用动态的配置方式,具体看下边的截图



如果想得到xml格式的,我们可以在请求地址后加上‘?type=xml’
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: