2015-04-27 4 views
5

Я хотел бы поймать все обычные исключения (экземпляры класса Exception) с одного из моих контроллеров (или в будущем на нескольких контроллерах), чтобы унифицировать их поведение. Я знаю, как сделать глобальные обработчики для исключений в Exceptions/Handler.php, но как я могу ограничить их каким-то определенным контроллером?Исключения API в Laravel 5

То, что я хочу сделать, это вернуть такой массив в формате 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); 
} 
Смежные вопросы