it-swarm.com.de

wie zeige ich 500 interne Server-Fehlerseiten in Laravel 5.2 an?

Ich möchte die Seite 500 internen Serverfehler Seite anzeigen. Wenn der Benutzer einen Syntaxfehler im Projekt hatte, kann mir jemand helfen? Wenn ich einen Fehler in der Syntax mache, möchte ich diese bestimmte Klinge zeigen. 

7
kunal

Sie müssen einen Handler erstellen, um FatalErrorExceptions in Ihrem Handler wie im folgenden Code abzufangen:

Handler In app/Exceptions/Handler.php 

public function render($request, Exception $e)
{

    // 404 page when a model is not found
    if ($e instanceof ModelNotFoundException) {
        return response()->view('errors.404', [], 404);
    }

    // custom error message
    if ($e instanceof \ErrorException) {
        return response()->view('errors.500', [], 500);
    } else {
        return parent::render($request, $e);
    }

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

View Siehe resources/views/errors/500.blade.php. Wenn nicht vorhanden, dann erstellen Sie es.

Sie können detailliertere OR - andere Möglichkeiten aus der - Laravel - 5 benutzerdefinierten Fehleransicht für 500 erhalten. 

Erstellen Sie in Ihrem resources/views/errors-Ordner eine Datei mit dem Namen 500.blade.php.

Laravel macht es einfach, benutzerdefinierte Fehlerseiten für verschiedene HTTP-Dateien anzuzeigen Statuscodes. Angenommen, Sie möchten die Fehlerseite für .__ anpassen. 500 HTTP-Statuscodes, erstellen Sie einen resources/views/errors/500.blade.php. Diese Datei wird für alle 500 Fehler bereitgestellt, die von Ihrer Anwendung generiert werden. 

Das Problem ist, dass Laravel dieses automatische Rendern von Fehlerseiten nur für Ausnahmen ausführt, die Instanzen von HttpException sind. Wenn Ihr Server einen Fehler auslöst (Methode existiert nicht, Variable undefiniert usw.), wird leider eine FatalErrorException ausgelöst. Als solches wird es nicht erfasst und läuft bis zur SymfonyDisplayer(), die entweder die Spur (debug true) oder den hässlichen Einzeiler "Whoops, sieht aus, als wäre etwas schief gelaufen" (debug false) aus.

Um dies zu lösen, müssen Sie dies Ihrer render-Methode zu app/Exceptions/Handler hinzufügen.

# /app/Exceptions/Handler.php

# use Symfony\Component\Debug\Exception\FlattenException;

# public function render($request, Exception $e)

$exception = FlattenException::create($e);
$statusCode = $exception->getStatusCode($exception);

if ($statusCode === 404 or $statusCode === 500) {
    return response()->view('errors.' . $statusCode, [], $statusCode);
}

Dokumente

4
Amit Gupta

Meine Lösung ist einfach, ersetzen Sie einfach Ihre render () - Methode in der Datei Exceptions\Handler.php durch:

/**
 * 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)
{
    if ($request->expectsJson()) {
        return $this->renderJson($request, $exception);
    }

    if ($this->shouldReport($exception) && app()->environment('production')) {
        $exception = new HttpException(500, $exception->getMessage(), $exception);
    }

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

In der Produktionsumgebung werden 500 Seiten angezeigt. Sie müssen eine 500.blade.php-Ansicht in Ihrem Ordner resources/views/errors haben.

1
Vedmant

erstellen Sie in App\Exceptions\Handler die folgende Methode:

protected function convertExceptionToResponse(Exception $e)
{
        $e = FlattenException::create($e);
        return response()->view('errors.500', ['exception' => $e], $e->getStatusCode(), $e->getHeaders());
}

dadurch wird die Klasse in der übergeordneten Klasse (Illuminate\Foundation\Exceptions\Handler) überschrieben, die die Whoops-Seite anzeigt.

0
Mody Sharf
    // app/Exceptions/Handler.php

    protected function prepareResponse($request, Exception $e)
    {
        if($this->isHttpException($e) === false && config('app.debug') === false)     {
            $e = new HttpException(500);
        }

        return parent::prepareResponse($request, $e);
    }

Wie @Amit sagte 

Das Problem ist, dass Laravel nur diese automatische Wiedergabe von .__ durchführt. Fehlerseiten für Ausnahmen, die Instanzen von HttpException sind.

Meine Lösung besteht also darin, jede Ausnahme, die keine HttpException ist, durch eine HttpException zu ersetzen.

0
Aurel

In Laravel 5.4 können Sie die prepareException-Funktion in Ihrem app\Exception\Handler.php überschreiben:

/**
 * @inheridoc
 */
protected function prepareException(Exception $e)
{
    $exception = parent::prepareException($e);

    if(!config('app.debug')) {
        if(!$exception instanceof HttpException && $this->shouldReport($exception)) {
            $exception = new HttpException(500);
        }
    }

    return $exception;
}
0
Haidang Nguyen