2017-06-14 78 views
0

我在Laravel中創建了一個工人類。通過異常的json響應

工人類與流明溝通。如果在流明中出現錯誤,它將以json的形式回覆給Laravel。

工人階級是這樣的: -

class Worker { 

    public function put($ip, $user, $file) 
    { 
     try { 
      $response = $this->client->post('/put', ['form_params' => ['ip' => $ip,'username' => $user, 'file' => $file]]); 

      $responseBody = (string)$response->getBody(); 
      // do something 

     } catch (ClientException | ServerException $e) { 
      return $this->handleRequestError($e); 
     } 
    } 


    protected function handleRequestError($e) 
    { 
     if ($e instanceof ClientException) { 
      if ($e->getCode() == 422) { 
       throw new WorkerValidationException((string)$e->getResponse()->getBody()); 
      } 
     } 

     if ($e instanceof ServerException) { 
      $error = json_decode($e->getResponse()->getBody(), true); 

      if ($error['error_type'] == 'ftp') { 
       throw new FtpException((string)$e->getResponse()->getBody()); 
      } 

      if ($error['error_type'] == 'somethingElse') { 
       throw new SomethingElseException((string)$e->getResponse()->getBody()); 
      } 
     } 


     throw new \Exception((string) $e->getResponse()->getBody()); 
    } 
} 

handleRequestError()方法讀取$error['error_type']值並拋出特定異常。

但是,我想要2或3個錯誤代碼($error['code'])以json格式迴應用戶。做這件事的好方法是什麼?

如:

if (if ($error['error_type'] == 'ftp' && $error['code'] == 200) { 
    response(['success' => false, 'message' => 'could not connect']); 
} 

我不想把響應邏輯的工人階級。我需要在異常處理程序中執行它嗎?

+0

工作者類​​看起來不錯,它應該總是拋出異常,應該由調用者函數負責決定拋出什麼異常或者要優雅地處理什麼。 –

回答

1

您可以將錯誤類型和錯誤代碼標識符綁定到應用容器,並讓它創建正確的異常類。例如:

app()->bind('type1-error1', ExceptionClass1::class); 
app()->bind('type2-error2', ExceptionClass2::class); 
app()->bind('type2-error3', ExceptionClass3::class); 

這些可以如在AppServiceProvider引導在應用程序生命週期的早期結合()。然後,異常處理程序可以使用解析基於該類型錯誤組合正確的異常的實例:

$e = app('type1-error1'); 
throw $e; 

的容器是在您的處置一個強大的工具!

+0

我想你誤解了我的問題。我最終在'Handler.php'中執行https://kopy.io/qxgfT –

+0

我不太確定。你正在做很多類型和字符串檢查來獲得正確的異常。服務容器正是爲了將類綁定到易於使用的解析機制。如果你正在尋找解決的特定異常的類名,你所要做的就是app() - > make(Exception :: class),它將爲你完成所有工作,如果涉及實例檢查,則不執行。 – btl

+0

如果您看看'put'方法 - 當'worker'類中調用'put'方法時,如果出現錯誤,則會調用catch塊中的handleRequestError方法,然後拋出特定的異常。在Handler.php中 - 如果'$ error ['error'] ['code'] == 100'匹配,那麼它將在json中響應。合理? –