[Php] Pagina di errore personalizzata non visualizzata su Laravel 5


Answers

Sono assolutamente d'accordo con tutti coloro che vogliono personalizzare l'esperienza di errore in Laravel in modo tale che i loro utenti non vedano mai un messaggio imbarazzante come "Whoops, sembra che qualcosa sia andato storto".

Mi ci sono voluti per sempre per capirlo.

Come personalizzare il messaggio "Whoops" in Laravel 5.3

In app/Exceptions/Handler.php , sostituisci l'intera funzione prepareResponse con questo:

protected function prepareResponse($request, Exception $e)
{        
    if ($this->isHttpException($e)) {            
        return $this->toIlluminateResponse($this->renderHttpException($e), $e);
    } else {
        return response()->view("errors.500", ['exception' => $e]); //By overriding this function, I make Laravel display my custom 500 error page instead of the 'Whoops, looks like something went wrong.' message in Symfony\Component\Debug\ExceptionHandler
    }
}

Fondamentalmente, è quasi identico alla funzionalità originale, ma stai solo cambiando il blocco else per rendere una visualizzazione.

In /resources/views/errors , crea 500.blade.php .

Puoi scrivere qualunque testo tu voglia lì dentro, ma consiglio sempre di mantenere le pagine di errore molto semplici (puro HTML e CSS e niente di speciale) in modo che ci siano quasi zero possibilità che essi stessi possano causare ulteriori errori.

Per verificare che funzionasse

In routes/web.php , è possibile aggiungere:

Route::get('error500', function () {
    throw new \Exception('TEST PAGE. This simulated error exception allows testing of the 500 error page.');
});

Quindi mysite.com/error500 e vedrò se visualizzi la tua pagina di errore personalizzata.

Quindi, mysite.com/some-nonexistent-route a mysite.com/some-nonexistent-route e verifica se ricevi ancora la pagina 404 che hai impostato, supponendo che tu ne abbia una.

Question

Sto tentando di visualizzare una pagina di errore personalizzata al posto del messaggio predefinito di Laravel 5:

"Whoops, sembra che qualcosa sia andato storto"

Ho fatto molte ricerche prima di postare qui, ho provato questa soluzione, che dovrebbe funzionare su Laravel 5 ma non ho avuto fortuna con esso: https://laracasts.com/discuss/channels/laravel/change-whoops-looks-like- qualcosa-andato-male-page

Ecco il codice esatto che ho nel file app/Exceptions/Handler.php :

<?php namespace App\Exceptions;

use Exception;
use View;
use Bugsnag\BugsnagLaravel\BugsnagExceptionHandler as ExceptionHandler;

class Handler extends ExceptionHandler {

    protected $dontReport = [
        'Symfony\Component\HttpKernel\Exception\HttpException'
    ];

    public function report(Exception $e)
    {
        return parent::report($e);
    }

    public function render($request, Exception $e)
    {
        return response()->view('errors.defaultError');
    }

}

Ma, invece di visualizzare la mia vista personalizzata, viene visualizzata una pagina vuota. Ho anche provato con questo codice all'interno della funzione render()

return "Hello, I am an error message";

Ma ottengo lo stesso risultato: pagina vuota




Ho due pagine di errore - 404.blade.php e generic.blade.php

Volevo:

  • 404 pagine da mostrare per tutte le pagine mancanti
  • Pagina di eccezione per eccezioni nello sviluppo
  • Pagina di errore generica per le eccezioni in produzione

Sto usando .env - APP_DEBUG per decidere questo.

Ho aggiornato il metodo di rendering nel gestore delle eccezioni:

app / Eccezioni / Handler.php

public function render($request, Exception $e)
{
    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    }

    if ($this->isUnauthorizedException($e)) {
        $e = new HttpException(403, $e->getMessage());
    }

    if ($this->isHttpException($e)) {
        // Show error for status code, if it exists
        $status = $e->getStatusCode();
        if (view()->exists("errors.{$status}")) {
            return response()->view("errors.{$status}", ['exception' => $e], $status);
        }
    }

    if (env('APP_DEBUG')) {
        // In development show exception
        return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
    }
    // Otherwise show generic error page
    return $this->toIlluminateResponse(response()->view("errors.generic"), $e);

}