架构图1,Requestlog请求消息日志,这里添加请求消息的原因是很多情况下,BUG是低频的,难以复现。原始请求消息可用于解决问题。这一层也可以放在中间件(Middleware)中处理参考例子:要求。**@param\Illuminate\Http\Request$request*@param\Closure$next*@returnmixed*/publicfunctionhandle($request,Closure$next){$params=$request->input();}$Uri=$request->getRequestUri();$UriArray=explode('?',$Uri);$UriArray=explode('/',$UriArray[0]);$this->dataRecodes('请求消息',$params,$UriArray[3]);返回$next($request);}}classHelper{/***@Notes:记录接口日志信息*@Author:董宪南*@Date:2021/8/53:50pm*@Description:描述*@param$title*@param$data*@paramstring$file*/publicstaticfunctiondataRecodes($title,$data,$file='log'){$date=date("Ymd");如果(!is_dir(存储路径('日志s/'。$date))){mkdir(storage_path('logs/'.$date),0777,TRUE);$content="================".$标题。''。日期('Y-m-dH:i:s')。"======================\n";file_put_contents(storage_path('logs/'.$date.'/'.$file.'.log'),$content.var_export($data,1).PHP_EOL,8);返回;}2.中间件全局中间件不做过多解释,中间件组,路由中间件根据实际场景合理使用3.请求层这里我在中间件和控制器之间加了一层Request,主要是参数验证的例子:classTestRequestextendsBaseRequest{publicfunctionrules(){return['nickname'=>'required','account_name'=>'required','role_id'=>'required','subject_id'=>'required','commission'=>'required',]+parent::rules();}publicfunctionmessages(){return[]+parent::messages();}publicfunctionattributes(){return['昵称'=>'nickname','account_name'=>'account','role_id'=>'roleID','subject_id'=>'subjectID','commission'=>'commissionratio',]+parent::attributes();}}4.Controller(控制器)从控制器中提取复杂的业务逻辑,放在Service(服务层)中,避免控制器臃肿、难以理解、难以维护classUserControllerextendsController{protected$userRepository;受保护的$用户服务;公共函数__construct(UserRepository$userRepository){$this->userRepository=$userRepository;}/***显示资源列表。*@returnRenderable*/publicfunctionindex(Request$request,UserService$userService,UserTransformer$userTransformer,UserFormatter$userFormatter){$user=$userService->getUserAll();returnresponse()->json($userFormatter->format($request,$userTransformer->transform($user)));}5.Service层的业务逻辑不是简单的查询数据,而是具体的任务,比如判断用户是否是会员,设置用户权限等,这些操作建议放在Service中,然后控制器然后称它为classUserService{protected$userRepository;公共函数__construct(UserRepository$userRepository){$this->userRepository=$userRepository;}publicfunctiongetUserAll(){if(1==1){//成员返回$this->userRepository->getUaerAll();}else{//todo}}6.Repository层是和Eloquent/DB相关的增删改查操作,将直接和数据库打交道的基本操作抽取出来放在Repository中,所以该模型将是干净的classUserRepository{protected$user;公共函数__construct(User$user){$this->user=$user;}publicfunctiongetUaerAll(){return$this->user->all();}7.Transformer,converter,例如,有一个获取仓库repository中所有用户信息的查询操作:$this->user->all();但是有些地方我们不需要用那么多字段,我只想有Name和email字段,是不是要把all()里面的参数改成$this->user->all(['name','电子邮件'])?这样一来,其他地方都需要所有字段,这不是冲突吗?这个时候Transformer就派上用场了。其实原理就是对$this->user->all()得到的数据进行过滤然后输出,添加一个过滤器(此外,转换器还可以对输出字段和数据字段进行区分,起到保护作用,还可以去除未完成的字段id、created_at、updated_at等)classUserTransformer{publicfunctiontransform(Collection$collection){$user=$collection->map(function($user){return['name'=>$user->name,'email'=>$user->email];});返回$用户;}8.Formatter主要用于保持API返回格式一致->method(),'code'=>Response::HTTP_OK,'message'=>'','items'=>$items];}9、returnlog(returnmessage),returnmessage和requestmessage成对放置Log系统讨论10.错误码:错误码需要统一正确的返回码:0或200系统错误码:-1或500系统错误不需要向用户显示,如数据库连接失败等业务错误码:1001、1002、1003等业务错误需要向用户显示。例如验证码发送失败,请重新发送!用户名密码错误等
