基于状态检修的试验数据分析系统--开发日志(四)--架构

开发遵循原则

tpadmin既然是基于ThinkPHP5开发的,遵循PHP开发标准的同时,也应遵循ThinkPHP5编码原则,以下是ThinkPHP5需要了解到的知识点,由于博客限制,只做一些重点的节选,摘抄出来。

架构总览需要注意的知识点

ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织。

MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型(M)、视图(V)、控制器(C),它们各自处理自己的任务。

5.0的URL访问受路由决定,如果关闭路由或者没有匹配路由的情况下,则是基于:

http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/参数/值…

生命周期(摘自官方文档)

1、入口文件

用户发起的请求都会经过应用的入口文件,通常是 public/index.php文件。当然,你也可以更改或者增加新的入口文件。

通常入口文件的代码都比较简单,一个普通的入口文件代码如下:

// 应用入口文件

// 定义项目路径
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

2、引导文件

start.php引导文件首先会调用base.php基础引导文件,某些特殊需求下面可能直接在入口文件中引入基础引导文件。

如果在你的应用入口文件中更改了默认的引导文件,则上述执行流程可能会跟随发生变化。

3、注册自动加载

系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载。

7、路由检测

如果开启了url_route_on参数的话,会首先进行URL的路由检测。

如果一旦检测到匹配的路由,根据定义的路由地址会注册到相应的URL调度。
5.0的路由地址支持如下方式:

路由到模块/控制器/操作;
路由到外部重定向地址;
路由到控制器方法;
路由到闭包函数;
路由到类的方法;

路由地址可能会受域名绑定的影响。

如果关闭路由或者路由检测无效则进行默认的模块/控制器/操作的分析识别。

如果在应用初始化的时候指定了应用调度方式,那么路由检测是可选的。
可以使用 \think\App::dispatch() 进行应用调度,例如:
App::dispatch(['type' => 'module', 'module' => 'index/index']);

8、分发请求

在完成了URL检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要的一个环节。

在这一步骤中,完成应用的业务逻辑及数据返回。

建议统一使用return返回数据,而不是echo输出,如非必要,请不要使用exit或者die中断执行。

9、响应输出

控制器的所有操作方法都是return返回而不是直接输出,系统会调用Response::send方法将最终的应用返回的数据输出到页面或者客户端,并自动转换成default_return_type参数配置的格式。所以,应用执行的数据输出只需要返回一个正常的PHP数据即可。

URL大小写

默认情况下,URL是不区分大小写的,也就是说 URL里面的模块/控制器/操作名会自动转换为小写,控制器在最后调用的时候会转换为驼峰法处理。

例如:

http://localhost/index.php/Index/Blog/read
// 和下面的访问是等效的
http://localhost/index.php/index/blog/read

如果访问下面的地址

http://localhost/index.php/Index/BlogTest/read
// 和下面的访问是等效的
http://localhost/index.php/index/blogtest/read

在这种URL不区分大小写情况下,如果要访问驼峰法的控制器类,则需要使用:

http://localhost/index.php/Index/blog_test/read

模块名和操作名会直接转换为小写处理。

如果希望URL访问严格区分大小写,可以在应用配置文件中设置:

// 关闭URL中控制器和操作名的自动转换
‘url_convert’ => false,

一旦关闭自动转换,URL地址中的控制器名就变成大小写敏感了,例如前面的访问地址就要写成:

http://localhost/index.php/Index/BlogTest/read

但是下面的URL访问依然是有效的:

http://localhost/index.php/Index/blog_test/read

下面的URL访问则无效:

http://localhost/index.php/Index/blogtest/read

需要注意:路由规则中定义的路由地址是按照控制器名的实际名称定义(区分大小写)。

隐藏入口文件

在ThinkPHP5.0中,出于优化的URL访问原则,还支持通过URL重写隐藏入口文件,下面以Apache为例说明隐藏应用入口文件index.php的设置。

更多其它环境的隐藏入口文件参考后面的 URL重写

tpadmin模块设计、配置目录

模块设计

5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改)。

目录结构

标准的应用和模块目录结构如下:

├─application 应用目录(可设置)
│ ├─common 公共模块目录(可选)
│ ├─common.php 公共函数文件
│ ├─route.php 路由配置文件
│ ├─database.php 数据库配置文件
│ ├─config.php 应用配置文件
│ ├─module1 模块1目录
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录(可选)
│ │ ├─view 视图目录(可选)
│ │ └─ … 更多类库目录
│ │
│ ├─module2 模块2目录
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录(可选)
│ │ ├─view 视图目录(可选)
│ │ └─ … 更多类库目录

遵循ThinkPHP5.0的命名规范,模块目录全部采用小写和下划线命名。

模块名称请避免使用PHP保留关键字(保留字列表参见 http://php.net/manual/zh/reserved.keywords.php ),否则会造成系统错误。

其中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承。

模块类库

一个模块下面的类库文件的命名空间统一以app\模块名开头,例如:

// index模块的Index控制器类
app\index\controller\Index
// index模块的User模型类
app\index\model\User

其中app可以通过定义的方式更改,例如我们在应用配置文件中修改:

‘app_namespace’ => ‘application’,

那么,index模块的类库命名空间则变成:

// index模块的Index控制器类
application\index\controller\Index
// index模块的User模型类
application\index\model\User

更多的关于类库和命名空间的关系可以参考下一章节:命名空间。
模块和控制器隐藏

由于默认是采用多模块的支持,所以多个模块的情况下必须在URL地址中标识当前模块,如果只有一个模块的话,可以进行模块绑定,方法是应用的入口文件中添加如下代码:

// 绑定当前访问到index模块
define(‘BIND_MODULE’,‘index’);

绑定后,我们的URL访问地址则变成:

http://serverName/index.php/控制器/操作/[参数名/参数值...]

访问的模块是index模块。

如果你的应用比较简单,模块和控制器都只有一个,那么可以在应用公共文件中绑定模块和控制器,如下:

// 绑定当前访问到index模块的index控制器
define(‘BIND_MODULE’,‘index/index’);

设置后,我们的URL访问地址则变成:

http://serverName/index.php/操作/[参数名/参数值...]

访问的模块是index模块,控制器是Index控制器。

单一模块

如果你的应用比较简单,只有唯一一个模块,那么可以进一步简化成使用单一模块结构,方法如下:

首先在应用配置文件中定义:

// 关闭多模块设计
‘app_multi_module’ => false,

然后,调整应用目录的结构为如下:

├─application 应用目录(可设置)
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─view 视图目录
│ ├─ … 更多类库目录
│ ├─common.php 函数文件
│ ├─route.php 路由配置文件
│ ├─database.php 数据库配置文件
│ └─config.php 配置文件

URL访问地址变成

http://serverName/index.php(或者其它应用入口)/控制器/操作/[参数名/参数值...]

同时,单一模块设计下的应用类库的命名空间也有所调整,例如:

原来的

app\index\controller\Index
app\index\model\User

变成

app\controller\Index
app\model\User

更多的URL简化和定制还可以通过URL路由功能实现。

tpadmin修改的文档路径

app/admin/view
这个目录很重要,不仅仅是HTML的存放路径,更重要的是路由规则、访问路径。后台模块添加的有文档,HTML目录下没有添加到的必将会报错,例如“找不到控制器”“找不到模块”“参数错误”等等。会给开发者带来不必要的困扰

ThinkPHP5配置格式

ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式

PHP数组定义

返回PHP数组的方式是默认的配置定义格式,例如:

//项目配置文件
return [
// 默认模块名
‘default_module’ => ‘index’,
// 默认控制器名
‘default_controller’ => ‘Index’,
// 默认操作名
‘default_action’ => ‘index’,
//更多配置参数
//…
];

配置参数名不区分大小写(因为无论大小写定义都会转换成小写),新版的建议是使用小写定义配置参数的规范。

还可以在配置文件中可以使用二维数组来配置更多的信息,例如:

//项目配置文件
return [
‘cache’ => [
‘type’ => ‘File’,
‘path’ => CACHE_PATH,
‘prefix’ => ‘’,
‘expire’ => 0,
],
];

其他格式支持

例如json格式,刚开始传参的时候并不知道PHP默认支持的是该种数据格式。我也曾被这种格式搞晕了。所有设置都正确,唯独是传入参数为空、写入为空。开发过程当中在这个环节浪费了大量的时间,影响项目进度。最终纠结了好长时间,才发现是格式问题,而非数据库连接、权限、数据表格式等问题。

这其中还包括以小项,做系统之前,牢记命名规则和保留字段。特别是习惯不好的初级程序员,很可能因为这样的低级错误耽误终生。

C、JAVA的参数格式都很清晰,唯独PHP支持的数据格式,没有读到该知识点并不十分了解。它不需要手动配置、转换,只需要配置好,系统自动给转换了。在这一节当中,我们会延申出来,用到许多抓包工具。例如前文提到的“瓷器”(记不住英文名字)、TP5默认状态工具等。都是为了传参、入库、计算做准备。没有这一步学习,前面很多工作都是零。

5.0.2版本开始支持yaml配置格式支持。

ini格式配置示例:

default_module=Index ;默认模块
default_controller=index ;默认控制器
default_action=index ;默认操作

xml格式配置示例:

Index index index

json格式配置示例:

{
“default_module”:“Index”,
“default_controller”:“index”,
“default_action”:“index”
}

猜你喜欢

转载自blog.csdn.net/weixin_41760494/article/details/100609891
今日推荐