web-dev-qa-db-fra.com

comment afficher la page d'erreur 500 Server interne dans Laravel 5.2?

Je veux montrer la page 500 erreur de serveur interne Page. quand l'utilisateur a eu une erreur de syntaxe dans le projet quelqu'un peut-il m'aider? si je fais une erreur de syntaxe, je veux montrer cette lame en particulier. 

7
kunal

Vous devez créer un gestionnaire pour capturer FatalErrorExceptions dans votre gestionnaire, comme ci-dessous:

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

Voir Voir resources/views/errors/500.blade.php. Si ce n'est pas le cas, créez-le.

Vous pouvez obtenir plus de détails OR par le biais de Vue d’erreur personnalisée Laravel 5 pour 500

11

Dans votre dossier resources/views/errors, créez un fichier nommé 500.blade.php.

Laravel facilite l'affichage de pages d'erreur personnalisées pour divers HTTP codes d'état. Par exemple, si vous souhaitez personnaliser la page d'erreur pour 500 codes de statut HTTP, créez un resources/views/errors/500.blade.php. Ce fichier sera servi sur les 500 erreurs générées par votre application. 

Le problème est que Laravel ne fera que ce rendu automatique des pages d'erreur pour les exceptions qui sont des instances de HttpException. Malheureusement, lorsque votre serveur génère une erreur (méthode inexistante, variable non définie, etc.), il génère en fait une variable FatalErrorException. En tant que tel, il est non capturé et passe au SymfonyDisplayer() qui vous donne la trace (debug true) ou le vilain lignage 'Whoops, on dirait que quelque chose a mal tourné' (debug false).

Pour résoudre cela, vous devez ajouter ceci à votre méthode render à app/Exceptions/Handler

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

Docs

4
Amit Gupta

Ma solution est simple, il suffit de remplacer votre méthode render () dans le fichier Exceptions\Handler.php par:

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

Il affichera 500 pages si l'application est en environnement de production. Vous devez disposer de 500.blade.php view dans votre dossier resources/views/errors.

1
Vedmant

dans app\Exceptions\Handler, créez la méthode suivante:

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

il remplacera celui de la classe parent (Illuminate\Foundation\Exceptions\Handler) qui affiche la page whoops.

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

Comme @Amit a dit 

Le problème est que Laravel ne fera que ce rendu automatique de pages d'erreur pour les exceptions qui sont des instances de HttpException.

Ma solution consiste donc à remplacer toute exception autre que HttpException par une HttpException.

0
Aurel

Dans Laravel 5.4, vous pouvez remplacer la fonction prepareException dans votre app\Exception\Handler.php:

/**
 * @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