2015-02-11 3 views
18

Im просто переходите к laravel 5 и im, получая ошибки от laravel на странице HTML. Что-то вроде этого:Laravel 5 общая ошибка как json

Sorry, the page you are looking for could not be found. 

1/1 
NotFoundHttpException in Application.php line 756: 
Persona no existe 
in Application.php line 756 
at Application->abort('404', 'Person doesnt exists', array()) in helpers.php line 

Когда я работаю с Laravel 4 все работает отлично, ошибки в формате JSON, таким образом я мог разобрать сообщение об ошибке и показать сообщение пользователю. Пример ошибки JSon:

{"error":{ 
"type":"Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException", 
"message":"Person doesnt exist", 
"file":"C:\\xampp\\htdocs\\backend1\\bootstrap\\compiled.php", 
"line":768}} 

Как я могу добиться того, что в Laravel 5.

Извините за мой плохой английский, спасибо много.

ответ

20

Я пришел сюда раньше, чтобы узнать, как выбросить исключения json в любом месте в Laravel, и ответ поставил меня на правильный путь. Для всех, кто считает этот поиск для подобного решения, вот как я реализовал приложение-широкое:

Добавить этот код render метода app/Exceptions/Handler.php

if ($request->ajax() || $request->wantsJson()) { 
    return new JsonResponse($e->getMessage(), 422); 
} 

Добавьте к этому методу для обработки объектов:

if ($request->ajax() || $request->wantsJson()) { 

    $message = $e->getMessage(); 
    if (is_object($message)) { $message = $message->toArray(); } 

    return new JsonResponse($message, 422); 
} 

И затем использовать этот общий кусок кода в любом месте вы хотите:

throw new \Exception("Custom error message", 422); 

И это будет преобразовывать все ошибки, возникающие после запроса Аякса исключения JSon готовому использовать любой, какой путь вы хотите :-)

+9

Если Laravel 5.1, возврат должен читать «return response() -> json ($ e-> getMessage(), 422);" –

+0

Это работает. Когда кода обработки нет, Laravel возвращает ошибку HTTP 500, независимо от конкретной ошибки, возникшей в коде. Например. 'abort (403)' вернет ошибку 500 для запросов ajax. Вы испытывали то же самое? Это должно быть ошибка? – clapas

+0

Это спасло мою жизнь. Это 2017 год, и я все еще использую 5.1, так что это действительно полезно для меня. Я передал 200 во второй аргумент при обработке исключения FatalErrorException, потому что я хочу, чтобы пользователь получил предупреждение с полезным сообщением, а не с неясным сообщением, таким как Internal Server Error. Это позволяет отображать страницу в обычном режиме и дает пользователю полезную обратную связь. – DavidHyogo

6

Laravel 5 предлагает обработчик исключений в app/Exceptions/Handler.php. Метод render может быть использован для визуализации конкретных исключений по-разному, т.е.

public function render($request, Exception $e) 
{ 
    if ($e instanceof API\APIError) 
     return \Response::json(['code' => '...', 'msg' => '...']); 
    return parent::render($request, $e); 
} 

Лично я использую App\Exceptions\API\APIError как общее исключение бросить, когда я хочу, чтобы вернуть ошибку API. Вместо этого вы можете просто проверить, является ли запрос AJAX (if ($request->ajax())), но я думаю, что явное определение исключения API кажется более чистым, потому что вы можете расширить класс APIError и добавить все необходимые функции.

12

Laravel 5,1

Чтобы сохранить свой HTTP код статуса на неожиданные исключения, как 404, 500 403 ...

Это то, что я использую (приложения/Исключение/handler.php):

public function render($request, Exception $e) 
{ 
    $error = $this->convertExceptionToResponse($e); 
    $response = []; 
    if($error->getStatusCode() == 500) { 
     $response['error'] = $e->getMessage(); 
     if(Config::get('app.debug')) { 
      $response['trace'] = $e->getTraceAsString(); 
      $response['code'] = $e->getCode(); 
     } 
    } 
    return response()->json($response, $error->getStatusCode()); 
} 
+0

Я сделал это, и ничего не появилось:/ – htafoya

4

Если вы хотите K код статуса eep (для интерфейсного интерфейса будет полезно понять тип ошибки). Я предлагаю использовать это в вашем приложении/Исключения/Обработчик.PHP:

public function render($request, Exception $exception) 
{ 
    if ($request->ajax() || $request->wantsJson()) { 

     // this part is from render function in Illuminate\Foundation\Exceptions\Handler.php 
     // works well for json 
     $exception = $this->prepareException($exception); 

     if ($exception instanceof \Illuminate\Http\Exception\HttpResponseException) { 
      return $exception->getResponse(); 
     } elseif ($exception instanceof \Illuminate\Auth\AuthenticationException) { 
      return $this->unauthenticated($request, $exception); 
     } elseif ($exception instanceof \Illuminate\Validation\ValidationException) { 
      return $this->convertValidationExceptionToResponse($exception, $request); 
     } 

     // we prepare custom response for other situation such as modelnotfound 
     $response = []; 
     $response['error'] = $exception->getMessage(); 

     if(config('app.debug')) { 
      $response['trace'] = $exception->getTrace(); 
      $response['code'] = $exception->getCode(); 
     } 

     // we look for assigned status code if there isn't we assign 500 
     $statusCode = method_exists($exception, 'getStatusCode') 
         ? $exception->getStatusCode() 
         : 500; 

     return response()->json($response, $statusCode); 
    } 

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

Это сработало очень хорошо, возвращает огромный json с трассировкой стека, но можно легко увидеть последнюю ошибку наверху – htafoya

0

Вместо

if ($request->ajax() || $request->wantsJson()) {...}

использование

if ($request->expectsJson()) {...}

поставщика \ Laravel \ рамки \ SRC \ Осветите \ Http \ концернах \ InteractsWithContentTypes.php: 42

public function expectsJson() 
{ 
    return ($this->ajax() && ! $this->pjax()) || $this->wantsJson(); 
} 
+1

объясните свой ответ, чтобы ОП и будущие читатели поняли лучше. –

0

Я обновил мой app/Exceptions/Handler.php поймать HTTP исключений, которые не были ошибки проверки:

public function render($request, Exception $exception) 
{ 
    // converts errors to JSON when required and when not a validation error 
    if ($request->expectsJson() && method_exists($exception, 'getStatusCode')) { 
     $message = $exception->getMessage(); 
     if (is_object($message)) { 
      $message = $message->toArray(); 
     } 

     return response()->json([ 
      'errors' => array_wrap($message) 
     ], $exception->getStatusCode()); 
    } 

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

Путем проверки метода getStatusCode(), вы можете сказать, если исключение может успешно быть принужден к JSON.

1

На Laravel 5.5 вы можете использовать метод prepareJsonResponse в app/Exceptions/Handler.php, который будет вызывать реакцию как JSON.

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $exception 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $exception) 
{ 
    return $this->prepareJsonResponse($request, $exception); 
} 
Смежные вопросы