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

阅读时长:10分钟php

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

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

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

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

1、定义控制器

在TP框架中定义控制器很是简单,只须要在模块下创建controller文件夹,在controller文件夹中定义一个PHP类文件便可,框架默认就自带了Index控制器。后端

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

接下来咱们访问URL:安全

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

会发现页面报错了,这是为何呢?app

这是由于TP框架会将HelloWorld解析成Helloworld控制器类而不是HelloWorld控制器类,因此就致使了找不到当前访问的控制器。

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

而后咱们在访问一次上面的URL

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

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

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

2、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格式。

3、控制器基类

使用控制器基类能够有效的执行一些公共的操做(例如权限和登陆检查)

下面咱们就用一个小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参数时,就能够正常访问了:

4、小结

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

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

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

5、控制器进阶

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

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

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

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

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

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

----- End -----

更多好文

请扫描下面二维码

欢迎关注~

相关文章
相关标签/搜索