转自WhiteWolfStack:查看原文上节课我们成功启动了hyperf,我们的目的是利用hyperf实现一个问答的接口开发系统。在开发需求之前,为了让我们的框架更加完善,我们先来看几个问题。接口统一响应异常类统一处理国际化支持枚举类和公共函数库的介绍今天我们先来看第一个问题。在接口开发中,固定数据结构的响应内容非常有利于客户端解析,所以我们有必要先定义一套统一的响应数据格式。比如请求失败时,统一返回{"code":错误码,"message":"NotFound"}。请求成功时,统一返回{"code":0,"data":[]}。当程序抛出异常时,统一返回,不管是主动抛出的还是系统抛出的异常{"code":errorcode,"message":"xxx"}下面看实现步骤:1.Controller的父类,AbstractController,添加成功和失败方法如下:publicfunctionsuccess($data=[]){return$this->response->json(['code'=>0,'data'=>$data,]);}publicfunctionfail($code,$message=''){return$this->response->json(['code'=>$code,'message'=>$message,]);}2.App\Controller\IndexController添加AutoController注解和测试方法如下:0){return$this->success(['info'=>'datainfo']);}else{return$this->fail(500,'id无效');}}}[AutoController]参考https://hyperf.wiki/3.0/#/zh-...3。重启容器/project/questions中的项目/数据#phpbin/hyperf.phpstart4.宿主机中的curl直接请求测试,结果如下:curlhttp://127.0.0.1:9501/index/info?id=1{"code":0,"data":{"info":"datainfo"}}%curlhttp://127.0.0.1:9501/index/info?id=0{"code":500,"message":"idinvalid"}%回头看,成功与失败我们第一步在AbstractController中添加的方法,都是针对response::json()方法进行封装的,但是还不够。如果我们在非Controller类(如Exceptionhandler)中也需要调整success和fail方法,这就尴尬了。下面进行简单的优化。在app目录下创建一个Components目录,封装一个独立的Response类,专门处理统一的响应。container=$container;$this->response=$container->get(ResponseInterface::class);}publicfunctionsuccess($data=[]){return$this->response->json(['code'=>0,'data'=>$data,]);}publicfunctionfail($code,$message=''){return$this->response->json(['code'=>$code,'message'=>$message,]);}}容器对象ContainerInterface参考https://hyperf.wiki/3.0/#/zh-...同时,AbstractController类中注入的Response类修改为App\Components\Response,如下:request->input('id',0);if($id>0){return$this->response->success(['info'=>'datainfo']);}else{return$this->response->fail(500,'idinvalid');}}也就是说,我们无论在什么地方,只需要注入App\Components\Response,就可以直接调用Response::success(),Response::fail。看似没有问题,其实漏洞百出。如果在程序中主动抛出异常怎么办?大家可以先自己想一想,我们会在下一节课中不断提高。
