2017-05-04 86 views
0

我正在使用中止函数从我的服务层发送自定义异常消息。Laravel - 捕获自定义中止消息

if($max_users < $client->users()->count()){ 
    return abort(401, "Max User Limit Exceeded"); 
} 

但是我怎么赶在我的控制器此消息,这是在不同的应用

try{ 

    $clientRequest = $client->request(
     'POST', 
     "api/saveClientDetails", 
     [ 
      'headers' => [ 
       'accept' => 'application/json', 
       'authorization' => 'Bearer ' . $user['tokens']->access_token 
      ], 
      'form_params' => $data, 
     ] 
    ); 

} catch (\GuzzleHttp\Exception\ClientException $clientException){ 

    switch($clientException->getCode()){ 
     case 401:  
      \Log::info($clientException->getCode()); 
      \Log::info($clientException->getMessage()); 

      abort(401); 
      break; 
     default: 
      abort(500); 
      break; 
    } 

} 

上面的代码打印了以下消息:

但它打印

Client error: `POST http://project-service.dev/api/saveClientDetails` resulted in a `401 Unauthorized` response: 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="UTF-8" /> 
     <meta name="robots" content="noindex,nofollow (truncated...) 

回答

1

那么你正试图抓住一个Gu Exception异常,而不是当你应该捕获Symfony HttpException。也许尝试是这样的:基于您的评论

catch(\Symfony\Component\HttpKernel\Exception\HttpException $e) 
{ 
    \Log::info($e->getMessage()); 
} 

,我试过如下:

public function test() 
{ 
    try 
    { 
     $this->doAbort(); 
    } 
    catch (\Symfony\Component\HttpKernel\Exception\HttpException $e) 
    { 
     dd($e->getStatusCode(), $e->getMessage()); 
    } 
} 

public function doAbort() 
{ 
    abort(401, 'custom error message'); 
} 

,输出是:

401 
"custom error message" 

基于您的评论,这里是怎么了为我工作。

Route::get('api', function() { 

    return response()->json([ 
     'success' => false, 
     'message' => 'An error occured' 
    ], 401); 

}); 

Route::get('test', function() { 

    $client = new \GuzzleHttp\Client(); 

    try 
    { 
     $client->request('GET', 'http://app.local/api'); 
    } 
    catch (\Exception $e) 
    { 
     $response = $e->getResponse(); 
     dd($response->getStatusCode(), (string) $response->getBody()); 
    } 

}); 

这会输出状态码和正确的错误消息。如果您使用abort,它仍然会返回完整的HTML响应。更好的方法是返回格式良好的JSON响应。

让我知道它是否适合你:)

+0

这个例外没有被捕获。 – fractal5

+0

编辑我的答案。 – Mozammil

+0

通过编写测试中止函数,我尝试了与您相同的事情。但是现在它并没有发现任何异常情况(一般的,粗暴的或者symfony),这很奇怪。 – fractal5