我可以把后置中间件放到前置中间件的前面吗?
TencentEncryptEncode中间件要加密所有response,其他前置中间件可能会抛出异常,异常类return response,如果把TencentEncryptEncode放到前面,其他前置中间件的response加密不了
Route::middleware([
//加密(后置中间件)
TencentEncryptEncode::class,
//TencentSimulateRequest::class,
//解密
TencentEncryptDecode::class,
//校验appkey
CheckAppkey::class,
//验证签名
TencentSign::class,
])->group(function () {
//接口
})
//验证签名中间件 - 前置
class TencentSign
{
public function handle(Request $request, Closure $next)
{
$result = Sign::verify('/'.$request->path(), $request->except('ciphertext'));
if ($result === false) {
throw new SignException();
}
return $next($request);
}
}
//异常类
class SignException extends Exception
{
/**
* 报告异常。
*
* @return bool|null
*/
public function report()
{
}
/**
* 渲染异常为 HTTP 响应。
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function render($request)
{
return response([
'status' => 1001,
'message' => '签名错误',
]);
}
}
我不明白 中间件不是 你放后面就是后置 放前面就是前置吗
中间件的顺序只是洋葱的层的顺序 他可以是前置的也可以是后置的 通常会按职能划分来处理层的顺序 职能覆盖面越大的 他所在的层越靠外
其他中间件会抛异常的或者返回的,需要统一的做一次拦截,再把数据加密返回。 就是加密的不止中间件,还有异常的抛出的数据也要做拦截加密。然后有直接返回的数据,那也做一个加密的类,返回的时候用这个响应类