ラボ > Laravel、Lumen:エラー関連

laravel エラーページのカスタマイズ

abort()だと細かい設定ができない…とか

作成日:2024-06-21, 更新日:2024-06-21

経緯

  • abort()を使っていた
  • ステータスコードが同じだけど、メッセージを変更したかった

対応

カスタムする必要があった…

  • カスタムしたHttpExceptionの準備
  • handlerの改修
  • エラーページの作成
  • 呼び出し

カスタムしたHttpExceptionの準備

▼app\Exceptions\CustomHttpException.php

<?php

namespace App\Exceptions;

use Symfony\Component\HttpKernel\Exception\HttpException;

class CustomHttpException extends HttpException
{
	protected $customMessage;

	public function __construct($statusCode, $customMessage = "")
	{
		parent::__construct($statusCode);
		$this->customMessage = $customMessage;
	}

	public function getCustomMessage()
	{
		return $this->customMessage;
	}
}

handlerの改修

▼app\Exceptions\Handler.phpにrender()追加

public function render($request, Throwable $exception)
{
	if ($exception instanceof CustomHttpException) {
		$statusCode = $exception->getStatusCode();
		$customMessage = $exception->getCustomMessage();

		$file = $statusCode;
		switch ( $customMessage ) {
			case 'xxx':
				$file = $customMessage; // メッセージ次第で専用のエラーページを使う
			break;
		}

		return response()->view("errors.{$file}", ['err_message' => $customMessage], $statusCode);
	}
	return parent::render($request, $exception);
}

エラーページの作成

ステータスコードがファイル名

▼resources/views/errors/500.blade.phpなど

<?php
	$title = 'システムエラー';
	$code = '500';

	$message = '';
	$message .= '現在Webサービスを正常にご提供することが出来ません。';
	if ( isset($err_message) ) {
		$message = $err_message;
	}
?>
@extends('errors.minimal')

専用に用意するファイル

$err_messageにHTMLを渡したいけど…面倒なのでビュー側にヒアドキュメントでセットしてみる

▼resources/views/errors/xxxx.blade.php

<?php
	$title = 'xxx';
	$code = '429';

	$message = <<<EOD
		<p>〇〇〇〇〇〇〇〇〇〇〇〇</p>
		<p>〇〇〇〇</p>
	EOD;

?>
@extends('errors.minimal')

errors.minimalの中身サンプル

▼resources/views/errors/minimal.blade.php

<html>
// 省略

<?php echo $err_message; ?>

// 省略
</html>

呼び出し

通常の呼び出し(abort())

abort(500);

特別なエラーページを呼び出し(abort())

// 省略
use App\Exceptions\CustomHttpException;

// 省略
	$code = 'xxx';
	$message = 'xxxxxxx';
	throw new CustomHttpException($code, $message);
// 省略

関連項目