thinkphpapi接口开发
接手过一个二手项目,口开对方用ThinkPHP写的口开接口,一打开控制器,口开好家伙,口开五百行的口开方法里塞了三百行SQL拼接。前端要个用户列表,口开他返回二十个字段,口开其中十一个前端根本不用。口开这不是口开个例,很多刚接触TP的口开开发者,把API写成了“数据库直通车”。口开 ThinkPHP做接口,口开核心就一句话:输入校验、口开输出规范、口开逻辑分层。口开这三点做到,接口质量不会差到哪去。 先说输入校验。TP的验证器(Validate)不是摆设,但很多人嫌麻烦,直接在控制器里写if-else。我见过最离谱的,一个登录接口,密码为空时返回“密码不能为空”,密码错误时返回“密码错误”,但两种情况HTTP状态码都是200。前端拿到200就以为成功,结果发现data是null,还得猜。正确做法是:校验失败返回422,业务失败返回400,成功才返回200。状态码是给程序看的,不是给人类看的——你得让程序一眼知道“这次请求到底成没成”。 输出规范更关键。TP默认的返回格式是数组或者对象,但前端要的是JSON。你可以在入口文件统一配置 code为0代表成功,非0代表失败,msg是给前端提示用的,data才是真正的业务数据。这套结构一旦定下来,后端不用每次写一堆重复代码,前端也不用每次猜字段含义。我见过一个团队,接口返回结构三个月换了四次,前端每次都要改解析逻辑,最后前端负责人直接在群里开骂——这事怪不了前端,后端自己都没想清楚。 逻辑分层这事,TP的MVC天然帮你分好了。但很多人把控制器当垃圾桶,查询、验证、权限、日志全往里塞。一个接口几十行,看着像流水账。正确姿势是:控制器只做“接参-调用-返回”三件事,具体业务逻辑扔到Service层。比如用户注册,控制器里调用 TP的ORM也值得好好用。很多人写接口还在用 还有个小细节,接口调试时,TP的调试模式(APP_DEBUG)会暴露SQL日志和异常堆栈。上线前务必关掉,不然等于把数据库表结构送给黑客。我见过一个线上项目,别人在URL后面加个 最后说个实际案例。之前帮一个电商项目重构接口,原来一个商品详情接口要2秒,原因是控制器里循环查询了20次数据库。重构后,用TP的json返回,但更推荐在基类控制器里封装一个success()和error()方法。比如这样:protected function success($data = [], $msg = 'ok') { return json(['code' => 0, 'msg' => $msg, 'data' => $data]); } protected function error($msg = 'error', $code = 1, $httpCode = 400) { return json(['code' => $code, 'msg' => $msg, 'data' => null], $httpCode); } UserService::register($data),Service里做唯一性检查、密码加密、写日志。这样改起来才不慌——加个字段,你只需要动Service,不用在控制器里翻几百行代码找哪里插进去。Db::query()拼原生SQL,一遇到表结构变更,SQL全得重写。TP的模型关联能帮你省掉大量join,比如获取用户订单,你定义好User hasMany Order关联,一句$user->orders就拿到订单列表,还自动处理了外键。前提是——你得先把表结构设计对,外键字段别随便命名,不然关联写起来能让你怀疑人生。?debug=1,直接能看到所有SQL语句——这跟裸奔没区别。with()预加载关联数据,一次查询搞定,耗时降到80毫秒。前端反馈“页面终于不卡了”,老板以为换了服务器,其实只是把代码写对了而已。别小看这些基础功夫,接口质量决定了用户体验的下限,也决定了后端维护成本的上限。
-
上一篇
-
下一篇