ページを表示したい500内部サーバーエラーページ。ユーザーがプロジェクトで構文エラーを犯したとき、誰も私を助けることができますか?構文に間違いがあると、その特定のブレードを表示したいです。
以下のコードのように、ハンドラーで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);
}
_
私の解決策は簡単です。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ビューが必要です。
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)にあるものをオーバーライドします。
// 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に置き換えることです。
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;
}