作成日: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); // 省略