So senden Sie Laravel-Fehlerantworten als JSON

Lesezeit: 4 Minuten

So senden Sie Laravel Fehlerantworten als JSON
Andrés

Ich gehe gerade zu Laravel 5 und erhalte Fehler von Laravel in der HTML-Seite. Etwas wie das:

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 4 arbeite, funktioniert alles gut, die Fehler sind im Json-Format, auf diese Weise konnte ich die Fehlermeldung analysieren und dem Benutzer eine Nachricht anzeigen. Ein Beispiel für einen 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 das in Laravel 5 erreichen?

Entschuldigung für mein schlechtes Englisch, vielen Dank.

Ich bin vorhin hierher gekommen, um zu suchen, wie man Json-Ausnahmen überall in Laravel auslöst, und die Antwort hat mich auf den richtigen Pfad gebracht. Für alle, die dies auf der Suche nach einer ähnlichen Lösung finden, habe ich Folgendes app-weit implementiert:

Fügen Sie diesen Code dem hinzu render Methode von app/Exceptions/Handler.php

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

Fügen Sie dies der Methode zum Behandeln von Objekten hinzu:

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

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

    return new JsonResponse($message, 422);
}

Und dann verwenden Sie diesen generischen Code, wo immer Sie wollen:

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

Und es konvertiert alle Fehler, die nach einer Ajax-Anfrage geworfen werden, in Json-Ausnahmen, die auf beliebige Weise verwendet werden können 🙂

  • bei Laravel 5.1 sollte die Rückgabe lauten “return response()->json($e->getMessage(), 422);”

    – Eric_WVGG

    4. September ’15 um 14:45

  • Das funktioniert. Wenn der Bearbeitungscode nicht vorhanden ist, gibt Laravel einen HTTP 500-Fehler zurück, unabhängig von dem spezifischen Fehler, der im Code geworfen wird. Z.B abort(403) würde einen 500-Fehler für Ajax-Anfragen zurückgeben. Hast du das gleiche erlebt? Das muss ein Bug sein?

    – clapas

    13. Februar ’16 um 16:28

  • 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. Ich habe beim Behandeln einer FatalErrorException 200 an das zweite Argument übergeben, weil ich möchte, dass der Benutzer eine Warnung mit einer nützlichen Nachricht erhält, anstatt eine obskure Nachricht wie Internal Server Error. Dadurch kann die Seite normal gerendert werden und gibt dem Benutzer nützliches Feedback.

    – DavidHyogo

    8. Januar ’17 um 10:38

Laravel 5.1

Um meinen HTTP-Statuscode bei unerwarteten Ausnahmen wie 404, 500 403…

Das verwende ich (app/Exceptions/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());
}

Laravel 5 bietet einen Ausnahmehandler in app/Exceptions/Handler.php. Der render -Methode kann verwendet werden, um bestimmte Ausnahmen anders darzustellen, d

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

Persönlich verwende ich AppExceptionsAPIAPIError als allgemeine Ausnahme zum Auslösen, wenn ich einen API-Fehler zurückgeben möchte. Stattdessen können Sie einfach überprüfen, ob die Anforderung AJAX ist (if ($request->ajax())), aber ich denke, das explizite Festlegen einer API-Ausnahme erscheint sauberer, da Sie die erweitern können APIError Klasse und fügen Sie alle benötigten Funktionen hinzu.

Auf Laravel 5.5 können Sie prepareJsonResponse Methode in app/Exceptions/Handler.php Dadurch wird eine Antwort als JSON erzwungen.

/**
 * Render an exception into an HTTP response.
 *
 * @param  IlluminateHttpRequest  $request
 * @param  Exception  $exception
 * @return IlluminateHttpResponse
 */
public function render($request, Exception $exception)
{
    return $this->prepareJsonResponse($request, $exception);
}

  • Das hat wirklich gut funktioniert, gibt ein riesiges Json mit Stacktrace zurück, kann aber den letzten Fehler leicht oben sehen

    – htafoya

    24. November ’17 um 3:05

1641821344 129 So senden Sie Laravel Fehlerantworten als JSON
Damian Domański

Anstatt

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

benutzen

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

VendorlaravelframeworksrcIlluminateHttpConcernsInteractsWithContentTypes.php:42

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

  • Erklären Sie Ihre Antwort, damit OP und zukünftige Leser es besser verstehen.

    – Geoman Yabes

    11. Okt ’17 um 12:32

So senden Sie Laravel Fehlerantworten als JSON
james2doyle

Ich habe meine aktualisiert app/Exceptions/Handler.php um HTTP-Ausnahmen abzufangen, die keine 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);
}

Indem Sie nach der Methode suchen getStatusCode(), können Sie feststellen, ob die Ausnahme erfolgreich in JSON umgewandelt werden kann.

  • Erklären Sie Ihre Antwort, damit OP und zukünftige Leser es besser verstehen.

    – Geoman Yabes

    11. Okt ’17 um 12:32

1641821344 359 So senden Sie Laravel Fehlerantworten als JSON
faye.babacar78

Wenn Sie Ausnahmefehler im Json-Format erhalten möchten, öffnen Sie die Handler-Klasse unter AppAusnahmenHandler und passen Sie es an. Hier ist ein Beispiel für Nicht autorisiert Anfragen und Nicht gefunden Antworten

public function render($request, Exception $exception)
{
    if ($exception instanceof AuthorizationException) {
        return response()->json(['error' => $exception->getMessage()], 403);
    }

    if ($exception instanceof ModelNotFoundException) {
        return response()->json(['error' => $exception->getMessage()], 404);
    }

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

.

305680cookie-checkSo senden Sie Laravel-Fehlerantworten als JSON

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy