class CrossDomain implements MiddlewareInterface
{
public function process(Request $request, callable $next): Response
{
// 如果是options請求,不處理業(yè)務
if ($request->method() == 'OPTIONS') {
$response = response('');
} else {
$response = $next($request); //如果控制器拋出異常,下面的給響應加跨域頭不生效,不會走下面的代碼。
}
$response->withHeaders([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET,POST,PUT,DELETE,OPTIONS',
'Access-Control-Allow-Headers' => 'Sig,ApiAuth,Content-Type,Authorization,X-Requested-With,Accept,Origin',
]);
return $response;
}
}
如果控制器 拋出異常,代碼中下面的給響應加跨域頭不會生效。
如果不拋出異常是正常的。但是有時候會在業(yè)務里面拋出業(yè)務異常,這是很常見的需求。
更新 webman-framework 到 1.0.3 或者后續(xù)的更高保本。
我看了異常處理類, 如果處理異常類 里面再次拋出異常,那么這里的$response就是一個異常字符串,字符串調用response對象的方法會再次拋出異常。其實這個問題也可以忽略,不會造成什么嚴重后果。如果在異常的render 返回之前拋出異常,最后會直接輸出異常字符串到瀏覽器。
//跨域中間件
public function process(Request $request, callable $next): Response
{
// 如果是options請求,不處理業(yè)務
if ($request->method() == 'OPTIONS') {
$response = response('');
} else {
$response = $next($request); //如果處理異常類 里面再次拋出異常,那么這里的$response就是一個異常字符串,字符串調用response對象的方法會再次拋出異常
}
$response->withHeaders([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET,POST,PUT,DELETE,OPTIONS',
'Access-Control-Allow-Headers' => 'Sign,ApiAuth,Content-Type,Authorization,X-Requested-With,Accept,Origin',
]);
return $response;
}
//異常處理
public function render(Request $request, Throwable $exception): Response
{
throw new \Exception('sendCode'); //注意這里
//異常有自定義處理方法
if (\method_exists($exception, 'render')) {
return $exception->render();
}
// 參數驗證錯誤
if ($exception instanceof ValidationException) {
return error($exception->getMessage());
}
// 處理自定義異常異常
if ($exception instanceof BusinessException) {
if ($exception->getCode()) {
return reMsg($exception->getMessage(), $exception->getCode(), $exception->getData());
} else {
return error($exception->getMessage(), $exception->getData());
}
}
//其他錯誤生產環(huán)境統(tǒng)一返回
if (!config('app.debug')) {
Log::error($exception->getMessage());
return error('網絡錯誤,請稍后再試', '');
}
return $this->sendDump($request, $exception);
}
/**
這里是控制器里面的方法