赵童鞋带你入门PHP(八) ThinkPHP控制器篇

2,415 阅读3分钟

阅读时长:10分钟

技术预备:ThinkPHP框架基础用法

童鞋们还记得一个URL请求的执行过程吗?

没错,就是:路由->控制器->模型(->视图)。

本章我们主要讲解ThinkPHP框架中的控制器的常用功能。

一、定义控制器

在TP框架中定义控制器非常简单,只需要在模块下建立controller文件夹,在controller文件夹中定义一个PHP类文件即可,框架默认就自带了Index控制器。

我们在index模块下定义一个HelloWorld控制器,并在其中增加base()方法。

接下来我们访问URL:

http://tp5.com/index/HelloWorld/base

会发现页面报错了,这是为什么呢?

这是因为TP框架会将HelloWorld解析成Helloworld控制器类而不是HelloWorld控制器类,所以就导致了找不到当前访问的控制器。

什么?你不信?那我们来打开框架的DEBUG模式看看,将config文件中的app_debug改为true。

然后我们在访问一次上面的URL

这次可以看到,框架明确的提示了控制器不存在:app\index\controller\Helloworld

那实际需要怎么访问HelloWorld控制器呢?很简单,将驼峰命名改为下划线命名就能正常访问了。

http://tp5.com/index/hello_world/base

二、JSON返回格式

在传统的开发模式中,我们访问某一个URL时,后端就会使用MVC架构中的View层通过模版引擎来渲染一个HTML页面。

这种时候我们的URL返回的是一大串的文本。

但是现在流行的是前后端分离开发,也就是说后端只负责数据的处理,通过JSON的格式来输入输出数据,而前端就根据后端URL,也就是接口来获取数据,并使用Vue、React之类的框架来渲染页面。

那么我们的TP框架怎么通过JSON格式返回接口数据呢?下面我们就来举一个小例子:

将HelloWorld控制器中的base方法改为返回一个数组,访问URL:

http://tp5.com/index/hello_world/base

会发现框架报错,报错的内容是variable type error: array

这是因为框架默认只接收文本的返回值,而我们这次返回的却是一个PHP数组,导致框架返回内容时报了类型错误。

想要将返回值由文本改为JSON格式也很简单,在config文件中,找到“default_return_type”一项,将原本的“html”改为“json”即可。

修改完毕后我们使用Postman来访问原来的接口。

可以看到,成功的返回了数据并且转为了JSON格式。

三、控制器基类

使用控制器基类可以有效的执行一些公共的操作(例如权限和登录检查)

下面我们就用一个小Demo来演示一下:我们假设访问参数login=1时为已登录。

假如我们每个接口都需要判断一下参数login,那岂不是重复的代码一堆一堆的?这种时候就可以使用控制器基类来实现公共操作。

在controller文件夹下创建Base类,并在其中添加__construct()方法。

那么我们怎们获取URL中的参数呢?了解PHP基础语法的童鞋肯定知道,PHP会把请求的参数放在超全局变量$_GET$_POST中。

但是直接从$_GET中获取参数是不安全的,会有被SQL注入的风险,在这里可以通过TP的助手函数request()获取到经过处理的参数值。(其实即使是经过处理的参数值也还是有SQL注入的风险,更保险的措施就是使用PDO来进行数据库操作,后面的模型讲解中将会提到)

后面的逻辑只需要输入以下代码,判断login参数是否存在。

使用Base类也非常简单,在HelloWorld中使用extends关键字继承于Base类。

当我们不传login参数时访问HelloWorld控制器中的base方法,就会抛出一个异常:

当我们传递了login参数时,就可以正常访问了:

四、小结

本章我们学习了如何定义控制器,如何配置JSON返回格式,如何获取URL中传递的参数,如何使用控制器基类。

控制器的功能大部分都是获取参数,将参数传递到模型层、服务层,获取返回的结果并返回。

其中获取参数时还可以依靠Validate类来进行参数校验,在后面的课程中我们会再来深入讲解控制器的其他功能。

五、控制器进阶

在上一章中,我们的URL请求走到了exec()方法。

在App类的exec()方法中,有几种执行的操作,而我们请求的URL就符合 /模块/控制器/操作 这种。

可以看到,一个URL请求被框架路由类解析完后就进入到module()方法。

在module()方法中,会读取很多我们在config.php中的配置进行初始化操作,最后塞到invokeMethod()这个方法中执行。

而invokeMethod()方法就会调用bindParams()方法根据请求的类型从$_GET$_POST变量中读取参数并存放到单例的Request对象中。

最后调用PHP的反射机制,根据Route类解析出来的控制器类实例化一个控制器对象,并调用这个对象里面的操作方法。

----- End -----

更多好文

请扫描下面二维码

欢迎关注~