2015-04-27 19 views
5

Chciałbym uchwycić wszystkie zwykłe wyjątki (wystąpienia klasy Exception) od jednego z moich kontrolerów (lub w przyszłości w kilku kontrolerach), aby zunifikować ich zachowanie. Wiem, jak zrobić globalne procedury obsługi wyjątków w Exceptions/Handler.php, ale jak mogę je ograniczyć do określonego kontrolera?Wyjątki API w Laravel 5

Co chcę zrobić, to zwrócić taką tablicę w formacie JSON, gdy wyjątek jest rzucony w moim kontrolera API:

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

mogłem zdecydować się rzucić własną klasę wyjątku, może ApiException, ale chcesz również obsługiwać wyjątki od osób trzecich, takie jak błędy bazy danych.

Czy powinienem przekazać pewną wartość bezpośrednio do obiektu żądania? Jeśli tak to jak? A może jest inny sposób?

Odpowiedz

3

Jeśli chcesz uczynić inny typ wyjątku dla konkretnego sterownika, można użyć obiektu żądania, aby sprawdzić aktualną Kontroler:

Wyjątki/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

Dzięki! '$ request-> route()' jest rzeczą, ale rozwiązałem ją za pomocą 'if ($ request-> ajax())', jest to łatwiejsze do debugowania. :) –

1

Można to zrobić:

stworzyć klasę wyjątku

class APIException extends Exception{ 

} 

następnie wyrzucić go ze sterownika

throw new APIException('api exception'); 

i złapać ją od Wyjątki/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

Proszę przeczytać dwa ostatnie akapity moje pytanie. –

2

Można także filtrować na żądanie według ich wzorów ścieżek.

Przejdź do pliku 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); 
}