thinkphp 模型分层

来源:segmentfault.com 更新时间:2023-05-25 21:55
 

以下内容摘自tp5手册

ThinkPHP支持模型的分层 ,除了Model层之外,我们可以项目的需要设计和创建其他的模型层。

通常情况下,不同的分层模型仍然是继承系统的thinkModel类或其子类,所以,其基本操作和Model类的操作是一致的。
例如在index模块的设计中需要区分数据层、逻辑层、服务层等不同的模型层,我们可以在模块目录下面创建model、logic和service目录,把对用户表的所有模型操作分成三层

  • 数据层:app\index\model\User 用于定义数据相关的自动验证和自动完成和数据存取接口

  • 逻辑层:app\index\logic\User 用于定义用户相关的业务逻辑

  • 服务层:app\index\service\User 用于定义用户相关的服务接口等

看到你修改了问题,并对问题做了详细描述,那么,我来好好的回答这个问题,其实整套分层的意义很简单,不外乎围绕的是根本原因:

程序 = 数据结构 + 算法

所有的层的拆分都是围绕着数据结构和算法来整理的,分层的根本意义也是为了让逻辑更加清晰易懂,首先,来看看你摘自TP官网的定义:

ThinkPHP支持模型的分层 ,除了Model层之外,我们可以项目的需要设计和创建其他的模型层。

通常情况下,不同的分层模型仍然是继承系统的thinkModel类或其子类,所以,其基本操作和Model类的操作是一致的。
例如在index模块的设计中需要区分数据层、逻辑层、服务层等不同的模型层,我们可以在模块目录下面创建model、logic和service目录,把对用户表的所有模型操作分成三层

  • 数据层:app\index\model\User 用于定义数据相关的自动验证和自动完成和数据存取接口
  • 逻辑层:app\index\logic\User 用于定义用户相关的业务逻辑
  • 服务层:app\index\service\User 用于定义用户相关的服务接口等

其实他官方的解释已经挺清楚了,但是如果你没有接触复杂的业务可能不太理解这三层的定义,我逐个就我遇到的一些业务问题来做详细的讲解:

数据层

数据层在这里其实指的是数据库表的数据,一般来说数据层会包含一整套相对于数据表的映射,这一套映射主要的是基本的字段名称和数据类型的映射,比如数据表order里有一个字段叫做order_sn并且是16位的字符串类型,那么在数据层模型里可以定义这套映射,而这套映射的根本目的其实也是为了实现程序做最基础的数据存储类型的验证,当然了,这套基本的自动验证也是依赖于框架来实现的。

然后就是自定义的一些自动验证了,比如数据类型是否是url,对数据进行安全过滤等等;也就是说,这一层完成数据的存储处理。当然也可以完成一些查询处理,如时间格式化等等。

逻辑层

逻辑层,从程序方面来思考,应该叫做算法层,这一层处理具体的一些数据的业务逻辑,或者做事务性的一次性存储多个数据表数据等,这一层最好也把大的复杂逻辑尽量拆分成小的业务逻辑,减少业务的耦合性。主要做的还是与具体业务相关的业务逻辑。

服务层

服务层一般来说是直接与控制器打交道的,提供给控制器进行调用的一层,这一层可以让多个控制器共用,而服务层所调用的数据业务层应该是逻辑层。

从以上三个方面来看,数据层可以说是程序的数据,而逻辑层是程序的算法;当然这个角度又是从宏观角度来看待的。而服务层又能把各个逻辑关联起来,起到很好的整体性,能提供给应用上层调用,减少代码的冗余,可以更好的复用。

另外我看到有人回答说用java来写,我觉得这就是语言论了,程序的根本就是思想,老是想着语言相关性,不知道意义何在,我更趋向于语言无关性,借鉴不同的语言特性思想,来表现不同的业务逻辑。