一个class里完成复杂业务的增删改查是什么体验。
一般来说,一个复杂的业务,首先会有很多涉及很多文件,但由于项目的历史原因,我能调用的就只有一个文件,里面也只有一个class,很多已经写固定了,动弹不得。
该 class 里,每个方法都是一个接口,完成极度复杂的业务,也只能一个个方法往里堆。
当然,看起来都挺正常,但是说一说更恶心的:
- 商家状态需要手写sql校验,多少个接口就要写多少次
- 数据库表的字段非常庞大,可能一个表上百个字段,而数据返回时全是字符串(?这个情况确实是存在的,如pdo默认),但经过接口处理后必须还原为 int 或 float
- 详情接口,复杂程序根据页面不同所需不同
- 数据权限控制,不同页面所需不同(比如数据不能删除,都有一个 del 字段,商品有上架下架状态,审核状态等,有时删除的也要能查看,有时下架的、审核不通过的也要查看等等)
- 到这还不是最离谱的,关键是需求经常变化,设计稿也是频繁修改,你一直在写,设计一直在改,写多久设计就改多久...
基于以上种种,必须要给每个方法封装起来,一层一层的,否则重复写的太多了(写最少的代码完成需求,因为代码越多,在频繁改动的情况下越吃亏,越容易出错),比如每个接口,都要强制 int ,float几十个字段,属实恶心到了。
权限控制
考虑到有时候就连“已经删除”的数据,都要能查看,已经不能简单的写死sql条件了。
考虑了一下,从最原始的:“没有条件”开始设计,给 class 增加了一个权限控制属性(默认没开启),如果开启权限,则调用数据时没有任何条件。
第一种: if( $this->$right){ $where = "" } ,当权限开启时,sql 的 where 就是空的,保证能查询数据,这是针对一个 id 查询数据的“情况”
第二种:先把数据查询出来,然后在接口的最后,做权限控制,如果开启了权限直接返回,如果没开权限,则判断数据是否合法,比如该数据中 del=1 则返回“数据不存在”等
接口分层
接口分层,是最关键的。
比如,前面说到的:一条数据,int 和 float 几十次,这肯定受不了。
获取数据的详情,首先只获取本表基本数据,作为基础接口。
比如,获取一个职位信息,前端需要连公司信息一起获取(这两个信息在两个表里),但职位详情不应该简单的把这两个数据混合在一块儿返回,否则职位详情接口每次都会携带公司详情。
可以做一个基础的职位详情:只返回职位表信息
然后做一个更丰富的职位详情:携带职位信息和公司信息(先调用基础接口,得到基础数据后增加字段)
正常的一个详情接口,给做成了两个,或多个
这样做不仅仅把详情分离出来了,而且在列表页面,可以先查出所有职位id,然后根据id,传递给详情接口,直接获取详情接口的数据(不用担心会多携带一次公司信息,因为已经分层了),也不用再每次 int 和 float 了。
增删改查的一些技巧
增删改,都相对简单,只要一个sql即可,复杂的情况也可以只有一个sql,就是前端同时传递要修改的字段名,这样就不用一次性全部更新(前端可能多种update,要修改的字段也不同,想要一个接口完成,不仅仅要传值,还得让前端告诉你更新哪些字段)。
查询非常多,而且处理很复杂,多封装一些方法,比如查指定数据,就封装为 detail 接口,列表接口时,无论多复杂,只要查询得到 id,再循环调用 detail 接口完成数据的获取。
尽管现实很离谱,但如果能解决得好,反而是对个人能力的一个很好的提升。
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-51.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。