2017-06-14 12 views
0

私はLaravelでワーカークラスを作成しました。例外によるjson応答

作業員クラスはルーメンと通信します。 Lumenにエラーがある場合、Laravelにjsonで応答します。

このような労働者階級: -

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']の値を読み、特定の例外をスローします。

しかし、私はjson形式のユーザーに応答するために2つまたは3つのエラーコード($error['code'])が必要です。これを行うための良いアプローチは何ですか?

例:

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 boot()などのアプリケーションライフサイクルの早い段階でバインドされる可能性があります。そして、例外ハンドラが使用するタイプのエラーの組み合わせに基づいて正しい例外のインスタンスを解決することができます:

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

コンテナはあなたの処分で強力なツールです!

+0

私はあなたが私の質問を誤解したと思います。私は 'Handler.php'でこのhttps://kopy.io/qxgfTをやることになりました。 –

+0

私はそれほど確信していません。あなたは正しい例外を得るために多くの型と文字列のチェックをしています。サービスコンテナは、簡単に使用できる解決メカニズムにクラスをバインドするためにこれを正確に行います。あなたが探している特定の例外のクラス名がある場合は、app() - > make(Exception :: class)だけで済むので、ifやinstanceのチェックは必要ありません。 – btl

+0

'put'メソッドを見てみると、' put'メソッドが 'worker'クラスで呼び出されたときにエラーがあれば、catchブロックで' handleRequestError'メソッドを呼び出してから、特定の例外をスローします。 Handler.php - '$ error ['error'] ['code'] == 100'がマッチすればjsonで応答します。理にかなっている? –

関連する問題