国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

關于webman的異常和中間件問題

小陽光
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è)務異常,這是很常見的需求。

5100 2 0
2個回答

小陽光

目前我的做法是集成APP類重寫onMessage里面的異常,但是這樣做不優(yōu)雅
或者去異常Handler里面添加頭。也不優(yōu)雅

截圖

  • 暫無評論
walkor 打賞

更新 webman-framework 到 1.0.3 或者后續(xù)的更高保本。

  • 小陽光 2020-09-21

    我看了異常處理類, 如果處理異常類 里面再次拋出異常,那么這里的$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);
    }

    /**
    這里是控制器里面的方法

    • @SWG\Post(path="/Tool/sendCode", tags={"Tool"},summary="發(fā)送驗證碼",
    • @SWG\Parameter(name="phone", type="string", required=true, in="formData",description="手機號碼"),
    • @SWG\Parameter(name="type", type="string", required=false, in="formData",default="normal_ttl",description="類型"),
    • @SWG\Response(response=200,description="返回成功",@SWG\Schema(ref="#/definitions/BasicReturn"))
    • )
    • @throws \support\exception\BusinessException
      */
      public function sendCode(Request $request)
      {
      throw new \Exception('sendCode'); //注意這里
      $phone = $request->post('phone');
      $type = $request->post('type', 'normal_ttl');
      Validator::phone()->setName('手機號碼')->check($phone);
      $this->push_msg->sendSmsCode($phone, $type);
      return success(L('Success'));
      }
  • walkor 2020-09-21

    根據接口規(guī)范,異常處理類render應該放回一個response對象,不應該再拋出異常。

  • 小陽光 2020-09-21

    好的

年代過于久遠,無法發(fā)表回答
??