讨论 Web 开发中 PHP 项目的合理分层
有时候写着写着代码,就会觉得自己写的一团糟。觉得这儿也不合理,那儿也不合理。强迫症更是为了很小的一些东西纠结半天。
在此只是讨论一下代码整体目录结构的分层合理性,并不是什么标准,也只是说一些自己的见解和大家一起讨论。
controller
当我们收到一个请求的时候,会先进入controller,那么这层应该做什么事情呢?我个人认为controller层应该做3件事情
1. 接收并验证参数的基本类型正确性和参数的必须性
2. 调用logic,可以调用多个logic
3. 返回响应
我们应该在这一层验证参数的基本正确性,而且只允许调用logic,可以调用多个logic进行配合完成最终的业务处理。至多写个if else调用不做其它处理。
logic
logic层,分发控制逻辑层,只能被controller调用,这层应该做3件事情
1. 进一步验证参数的正确性,比如是否存在数据,或者其他复杂逻辑的验证
2. 调用service层,可以调用多个service实现具体业务,比如调用serviceA得到结果,再传入serviceB获取数据。
3. 返回结果
每个controller都应该对应一个logic,而且方法一一对应,这层我们用来进一步验证参数的合法性,以及控制service层,使得彼此配合完成业务。这层只能调用service。而不能相互调用。
service
service层,具体的业务层,这层应该书写详细的逻辑处理,
1. 书写具体逻辑,一般可以是被多次调用的。这层需要灵活的解耦,以便于logic调用。
2. 调用model层,model层应该只能被service调用。
3. 返回结果
service只能被logic调用,不能彼此调用
lib
现在还有一个问题就是,service层可能会相互依赖,比如serviceA依赖serviceB,或者同时logicA也依赖serviceB,那么service是不应该互相调用的。我个人想法是在service层建一个lib。我们可以把serviceA依赖serviceB的方法提取出来,写一个Trait亦或者是一个类。总之service的共用方法提取到lib里面。这样完成解耦。
model
model我觉得没有争议,就是和数据库打交道。
最终目录结构
Controller
Logic
Service
--Lib
Models
总体流程就是 controller调用logic,logic调用service,service的彼此依赖提取到lib中,service调用model。这样配合完成最终的处理。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: