Laravel 如何完成beforeResponse功能?

本文讨论了在Laravel项目中如何实现统一的数据输出结构,特别是在API应用中。通过分析Laravel的异常处理机制,提出了在ExceptionHandler中处理异常并结合中间件实现beforeResponse功能的方法,以达到在所有路由中格式化数据输出的目标。
摘要由CSDN通过智能技术生成

背景

一般的项目需求都会要求统一的输出结构,特别是对于api应用而言。因此,如果有beforeResponse的功能,则可以在数据输出之前对response进行统一格式化处理。

假设这么一种场景,应用做api开发,使用抛异常的方式(自定义异常类ApiException)返回无效非法请求的情况。正常请求则返回合法数据(数组或可序列化的模型),希望返回的数据格式

正常请求返回数据格式:

{
   
  "code":0,
  "data":[

  ],
  "message":""
}

异常请求返回数据格式:

{
   
  "code":400,
  "data":[

  ],
  "message":"错误提示"
}

Laravel 的设计如何实现

Laravel中的中间件确实支持beforeResponse操作,支持在中间件中进行格式化。但是,这里仅限于正常返回。那么如果控制器抛了异常又改怎么办呢?

Laravel的调用链使得控制器里的异常在正常情况下,还没有抛到中间件就被系统注册的ExceptionHandler类拦截处理了。github上也有关于中间件不能捕获控制器异常的问题Can’t catch exception in middleware

作者给出的结论是,Laravel本身的设计就是将异常处理放在ExceptionHandler中。

Yes, this is the beavhiour starting from L5.2. Throwing an exception causes the response to be set as that returned from the exception handler, and then the middleware is allowed to backout from that point.

We don’t recommend you write try catch blocks in middleware. Instead, handle exceptions inside the exception handler. Perhaps https://github.com/GrahamCampbell/Laravel-Exceptions would be of use to you?

那么,按照Laravel的设计,正常的请求,我们在一个中间件FormaterResponse处理,处理逻辑如下:


<?php
namespace App\Http\Middleware;
use App\Http\Middleware\Closure;
use \Exception
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值