2015-04-27 104 views
5

我想從我的一個控制器(或將來在幾個控制器中)捕獲所有普通異常(Exception類的實例)以統一它們的行爲。我知道如何在異常/ Handler.php中爲異常做全局處理程序,但是我怎樣才能限制它們到某個特定的控制器呢?Laravel 5中的API異常

我想要做的是JSON格式返回這樣一個數組時的例外是在我的API控制器拋出:

[ 
    'error' => 'Internal error occurred.' 
] 

我決定把我自己的異常類,也許ApiException,但我還想爲第三方異常提供服務,例如數據庫錯誤。

我應該直接傳遞一些值給請求對象嗎?如果是這樣,怎麼樣?或者也許有另一種方式?

回答

3

如果你想呈現一個不同類型的異常進行特定的控制器,你可以使用請求對象,檢查電流控制器:

例外/ Handler.php

public function render($request, Exception $e) 
{ 
    if($request->route()->getAction()["controller"] == "App\Http\Controllers\[email protected]"){ 
     return response()->json(["error" => "An internal error occured"]); 
    } 
    return parent::render($request, $e); 
} 
+0

謝謝! '$ request-> route()'是事情,但我通過使用if($ request-> ajax())來解決它,它更容易進行調試。 :) –

1

你可以這樣做:

創建一個異常類

class APIException extends Exception{ 

} 

然後從控制器

throw new APIException('api exception'); 

把它和例外抓住它/ Handler.php

public function render($request, Exception $e) 
{ 
    if ($e instanceof APIException){ 
     return response(['success' => false, 'data' => [], 'message' => $e->getMessage(), 401); 
    } 
    if ($e instanceof SomeException){ 
     return response(['success' => false, 'data' => [], 'message' => 'Exception'], 401); 
    } 

    return parent::render($request, $e); 
} 
+0

請閱讀我的問題的最後兩個段落。 –

2

您還可以篩選由他們的路徑模式請求。

轉到文件app\Exceptions\Handler.php

public function render($request, \Exception $e) 
{ 
    /* Filter the requests made on the API path */ 
    if ($request->is('api/*)) { 
     return response()->json(["error" => "An internal error occured"]); 
    } 

    return parent::render($request, $e); 
}