2015-02-11 3 views
18

Ich bin nur auf Laravel 5 und ich empfange Fehler von Laravel in HTML-Seite. Etwas wie folgt aus:Laravel 5 allgemeiner Fehler als 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 

Wenn ich mit Laravel arbeiten 4 alles funktioniert gut, sind die Fehler im JSON-Format, auf diese Weise die Fehlermeldung nicht analysieren und eine Nachricht an den Benutzer anzuzeigen. Ein Beispiel für json Fehler:

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

Wie kann ich erreichen, dass in Laravel 5.

Sorry für mein schlechtes Englisch, vielen Dank.

Antwort

20

Ich kam früher hierher, um zu suchen, wie JSON-Ausnahmen überall in Laravel zu werfen und die Antwort setzte mich auf den richtigen Weg. Für alle, die diese Suche nach einer ähnlichen Lösung findet, ist hier, wie ich implementiert App weit:

Fügen Sie diesen Code auf die render Methode von app/Exceptions/Handler.php

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

das Hinzufügen der Methode Objekte zu handhaben:

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

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

    return new JsonResponse($message, 422); 
} 

Und dann diese generische Stück Code verwenden, wo immer Sie wollen:

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

Und es wird alle Fehler geworfen, nachdem ein Ajax-Request an Json Ausnahmen konvertieren bereit, jede Art und Weise, die Sie :-)

+9

Wenn Laravel 5.1, sollte die Rückkehr lesen "Antwort zurück() -> Json ($ e-> getMessage(), 422);" –

+0

Das funktioniert. Wenn der Verarbeitungscode nicht vorhanden ist, gibt Laravel einen HTTP 500-Fehler zurück, unabhängig vom spezifischen Fehler, der im Code ausgelöst wird. Z.B. 'abort (403)' würde einen 500 Fehler für Ajax-Anfragen zurückgeben. Hast du das gleiche erlebt? Das muss ein Fehler sein? – clapas

+0

Das hat mir das Leben gerettet. Es ist 2017 und ich benutze immer noch 5.1, also ist das wirklich nützlich für mich. Bei der Behandlung einer FatalErrorException habe ich 200 an das zweite Argument übergeben, weil ich möchte, dass der Benutzer eine Warnung mit einer nützlichen Nachricht anstelle einer obskuren Nachricht wie Interner Serverfehler erhält. Dies lässt die Seite normal rendern und gibt dem Benutzer nützliche Rückmeldungen. – DavidHyogo

6

Laravel 5 bietet einen Ausnahme-Handler in app/Exceptions/Handler.php. Die render Verfahren können bestimmte Ausnahmen verwendet werden, unterschiedlich zu machen, das heißt

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

Ich persönlich App\Exceptions\API\APIError als allgemeine Ausnahme verwenden zu werfen, wenn ich eine API-Fehler zurückgeben möchten. Stattdessen könnten Sie einfach überprüfen, ob die Anfrage AJAX ist (if ($request->ajax())), aber ich denke, das explizite Setzen einer API-Ausnahme scheint sauberer zu sein, da Sie die APIError-Klasse erweitern und alle Funktionen hinzufügen können, die Sie benötigen.

12

Laravel 5.1

wollen verwendet werden, um meine HTTP-Statuscode auf unerwartete Ausnahmen zu halten, wie 404, 500 403 ...

Das ist, was ich benutze (app/Ausnahmen/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

Ich tat dies und nichts zeigte sich:/ – htafoya

4

Wenn Sie k wollen eep status code (es wird nützlich sein, wenn die Frontend-Seite den Fehlertyp versteht) Ich empfehle, dies in Ihrer App/Exceptions/Handler zu verwenden.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

Dies funktionierte wirklich gut, gibt einen riesigen JSON mit Stack-Trace zurück, aber kann den letzten Fehler an der Spitze – htafoya

0

Statt

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

Verwendung

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

Anbieter \ Laravel \ Framework \ src \ Illuminate \ Http \ Bedenken \ InteractsWithContentTypes.php: 42

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

Ihre Erklärung erklären, so dass OP und zukünftige Leser besser verstehen werden. –

0

ich meine app/Exceptions/Handler.php aktualisiert, um HTTP-Ausnahmen abfangen, die nicht Validierungsfehler waren:

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); 
} 

für das Verfahren Durch die Überprüfung getStatusCode(), können Sie feststellen, ob die Ausnahme erfolgreich zu JSON dazu gezwungen werden kann.

1

Auf Laravel 5.5 können Sie prepareJsonResponse Methode in app/Exceptions/Handler.php verwenden, die Antwort als JSON erzwingen.

/** 
* 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); 
}