0

Ich machte den folgenden Controller, um das Problem der Behandlung von 500 Fehlern, die ich mit der API habe, zu demonstrieren. Ich will in der Lage zu erkennen, wenn ein 500-Fehler ausgelöst wird, so dass es nie an den Client (da es zu viele Details ist, um mit dem Client zu teilen und sie sollten nur von Laravel protokolliert werden).Laravel 5.5 - Nur log 500 Fehler, nie Fehlerdetails über API senden?

Verfahren getUser() einen 500-Fehler absichtlich aufgrund der Tippfehler firsgt()

class TestController extends Controller { 
    public function getUser() { 
    $data = User::firsgt(); //returns 500 error 
    return $data; 
    } 
} 

kehrt Dies ist, was der Kunde sieht: enter image description here

Wie können wir eine Fehlermeldung wie ‚Fehler aufgetreten‘ statt zurückkehren der zu vielen Details für den Client 'Aufruf zu undefinierter Methode App \ User :: firsgt()'?

Anmerkung: Ich will sie nicht eins nach dem anderen für jeden Controller-Methode zu handhaben, sondern alle 500 erfassen, bevor sie an den Client zurückgegeben wird, und gibt die benutzerdefinierte 500 allgemeine Meldung ‚Fehler aufgetreten‘

Antwort

1

einfach die Variablen in Ihrer .env Datei ändern, um diese Mitteilungen gesendet mit der Reaktion zu verhindern.

APP_ENV = Produktion

APP_DEBUG=false 

Edit: nur APP_DEBUG auf false gesetzt ist genug.

Update: Wenn Sie Dingo api-Paket verwenden, dann neben APP_DEBUG auf false setzen müssen Sie die Konfigurationsdatei bearbeiten.

Wenn Sie nicht bereits schon getan haben, veröffentlichen Dingo Konfigurationsdatei

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider" 

Dann öffnen config/api.php und editiere den errorFormat Wert zu der gewünschten Nachricht.

ersetzen :message mit einer generischen Nachricht

+0

Dies funktioniert wirklich gut auf Standard-Laravel, aber ich habe das Problem mit Dingo API. Als richtig markiert, da es anderen und mir für die Laravel-Lösung hilft (was meiner Meinung nach mein spezifisches Problem lösen würde), funktioniert aber nicht, wenn es mit der Dingo-API verwendet wird. Wird eine Frage für die Dingo API-Version der gleichen Frage öffnen. – Wonka

+0

Überprüfen Sie die update Dingo API. – Hamoud

1

Sie haben app/Exception/Handler.php Klasse, dies zu tun. Zum Beispiel können Sie Code ähnlich wie diese verwenden:

public function render($request, Exception $e) 
{ 
    $exception_class = get_class($e); 

    if (!in_array($exception_class, [ValidationException::class, ModelNotFoundException::class]) { 
     return response()->json(['info' => 'Error occurred'], 500); 
    } 

    return parent::render(); 
} 

aber wie Sie sehen, sollten Sie einige Ausnahmeklassen ausschließen, die Sie in gewohnter Weise gerendert werden möchten, sind hier nur einige Beispiele für Ausnahmeklassen.

Offensichtlich im Fall, dass Sie API wahrscheinlich entwerfen, gibt es keinen Sinn, parent::render() überhaupt zu verwenden, und Sie sollten benutzerdefinierte Ausnahmeklassen in benutzerdefinierter Weise behandeln und schließlich schließlich für andere Ausnahmen 500 Antwort mit der gewünschten Nachricht zurückgeben.

+0

Vielen Dank dafür, ich fand für Laravel, es war viel einfacher zu tun 'APP_DEBUG = false' so behandelt es die Fehler sicher/generisch 'Fehler aufgetreten' für Kunden. Das Problem habe ich noch, aber mit Dingo API, also habe ich die gleiche Frage aber für Dingo API geöffnet. – Wonka

1

können Sie verwenden try ... catch

try{ 
    ..... 
}catch(\Exception $e){ 
    if($e->getCode() == 500){ 
     return response()->json(["error"=>'$e->getCode()'],500); 
    } 
} 
+0

true, aber ich wollte nicht versuchen, fangen explizit in meinem Code für alle Controller-Methoden. Nur ein einfacher globaler Weg, um 500 Laravel-Würfe zu bewältigen und den Fehler zu erfassen. – Wonka

1

Laravel tut dies bereits für Sie, aber nur, wenn Sie im Produktionsmodus sind und die Anforderung JSON erwartet.

Wie auch immer, die App \ Exceptions \ Handler Klasse ist, wo alle Ausnahmen behandelt werden können. Es ist auch der Ort, an dem alle Ausnahmen von Laravel selbst protokolliert und gerendert werden.

public function render($request, Exception $exception) 
{ 
    // your logic here 

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

Die detaillierte Erläuterung des Fehlers ist in develpment Umgebungen gezeigt, für die Produktion Sie wollen sie nicht -für Sicherheit zeigen reasons- so, wie @Hamoud angegeben, gehen sie zu Ihrem .ENV Datei finden sie die Zeile:

APP_DEBUG=true 

Änderung es zu:

APP_DEBUG=false 

Dies zeigt nur die Standardfehlerreaktionen an. Überprüfen Sie die Dokumentation über error details.

Verwandte Themen