web-dev-qa-db-ja.com

laravel 5.2?で500内部サーバーエラーページを表示する方法

ページを表示したい500内部サーバーエラーページ。ユーザーがプロジェクトで構文エラーを犯したとき、誰も私を助けることができますか?構文に間違いがあると、その特定のブレードを表示したいです。

11
kunal

以下のコードのように、ハンドラーでFatalErrorExceptionsをキャッチするハンドラーを作成する必要があります。

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

Viewresources/views/errors/500.blade.phpを参照してください。存在しない場合は作成します。

より詳細なOR Laravel 5の500のカスタムエラービュー

_resources/views/errors_フォルダーに_500.blade.php_という名前のファイルを作成します。

Laravelでは、さまざまなHTTPステータスコードのカスタムエラーページを簡単に表示できます。たとえば、500 HTTPステータスコードのエラーページをカスタマイズする場合は、_resources/views/errors/500.blade.php_を作成します。このファイルは、アプリケーションで生成された500個のエラーすべてで提供されます。

問題は、LaravelはHttpExceptionのインスタンスである例外のエラーページのこの自動レンダリングのみを行うことです。サーバーがエラーをスローすると(メソッドが存在しない、変数未定義など)実際にFatalErrorExceptionをスローします。したがって、キャッチされず、SymfonyDisplayer()にトリクルし、トレース(デバッグtrue)またはいワンライナー 'おっと、何かがおかしくなったようです」(デバッグが偽)。

これを解決するには、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);
}
_

ドキュメント

6
Amit Gupta

私の解決策は簡単です。Exceptions\ Handler.phpファイルのrender()メソッドを次のように置き換えるだけです:

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

実稼働環境のアプリの場合、500ページが表示されます。 resources/views/errorsフォルダーに500.blade.phpビューが必要です。

1
Vedmant

app\Exceptions\Handlerに次のメソッドを作成します。

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

whoopsページを表示する親クラス(Illuminate\Foundation\Exceptions\Handler)にあるものをオーバーライドします。

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

@Amitが言ったように

問題は、Laravelは、HttpExceptionのインスタンスである例外に対してエラーページのこの自動レンダリングのみを行うことです。

したがって、私の解決策は、HttpExceptionではない例外をHttpExceptionに置き換えることです。

0
Aurel

Laravel 5.4では、prepareException関数を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