# 画面設計書 7-500 Internal Server Error

## 概要

本ドキュメントは、Laravel フレームワークにおける HTTP 500 Internal Server Error 画面の設計書です。サーバー側で予期しないエラーが発生した場合に表示されるエラー画面について記載しています。

### 本画面の処理概要

HTTP 500 Internal Server Error 画面は、サーバー側で予期しない例外やエラーが発生し、リクエストを正常に処理できなかった場合に表示される画面です。この画面は、ユーザーに対して一時的な問題が発生したことを通知し、後ほど再試行することを促す役割を果たします。

**業務上の目的・背景**：Web アプリケーションにおいて、予期しないエラー（データベース接続エラー、外部サービスの障害、プログラムのバグなど）が発生した場合、ユーザーに対して技術的な詳細を露出せずに、適切なエラーメッセージを表示する必要があります。本画面は、セキュリティの観点から内部エラーの詳細を隠しつつ、ユーザーに対して問題が発生したことを明確に伝えます。また、開発環境では詳細なエラー情報が表示され（デバッグモード）、本番環境ではこのシンプルなエラー画面が表示されることで、セキュリティと開発効率の両立を実現しています。

**画面へのアクセス方法**：この画面は直接アクセスするものではなく、以下のような状況で自動的に表示されます。
1. 未処理の例外がスローされた場合
2. データベース接続エラーが発生した場合
3. 外部 API 呼び出しが失敗した場合
4. プログラムのバグによるエラーが発生した場合
5. サーバーのリソース不足やタイムアウト

**主要な操作・処理内容**：
1. エラーコード「500」とメッセージ「Server Error」を画面中央に表示
2. ダークモード対応のスタイリングにより、ユーザーの表示設定に応じた適切な配色で表示
3. レスポンシブデザインにより、デスクトップ・モバイル両方のデバイスで適切に表示

**画面遷移**：
- 遷移元：サーバーエラーが発生した任意の画面
- 遷移先：なし（エラー表示のみ。ユーザーはブラウザの「戻る」ボタンまたはトップページへの移動で復帰）

**権限による表示制御**：この画面は権限に関係なく、サーバーエラーが発生した場合に全てのユーザーに表示されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 46 | ログ管理 | 補助機能 | サーバーエラー発生時のログ出力連携 |
| 36 | ビューファクトリ | 主機能 | Blade テンプレートのレンダリング処理 |

## 画面種別

エラー表示画面

## URL/ルーティング

この画面は特定の URL を持ちません。HTTP レスポンスステータスコード 500 が返される際に、例外ハンドラ（`Illuminate\Foundation\Exceptions\Handler`）により自動的にレンダリングされます。

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|------|------|------|
| なし | - | - | この画面は入力項目を持ちません |

### 出力項目（テンプレート変数）

| 項目名 | 型 | 説明 |
|--------|------|------|
| $exception | HttpExceptionInterface | 発生した例外オブジェクト |
| $errors | ViewErrorBag | バリデーションエラーバッグ（空） |

## 表示項目

| 項目 | 表示内容 | スタイル |
|------|----------|----------|
| エラーコード | 500 | 大きなフォント、右ボーダー付き |
| エラーメッセージ | Server Error | 大文字、トラッキング広め |

## イベント仕様

### 1-画面表示

本画面は静的なエラー表示のみを行い、ユーザーインタラクションのイベントは定義されていません。ブラウザの「戻る」ボタンまたは直接 URL 入力により他の画面へ遷移します。

## データベース更新仕様

本画面はデータベースへの読み書きを行いません。ただし、エラー発生時には Handler クラスの `report()` メソッドによりエラーがログに記録されます。

## メッセージ仕様

| メッセージ種別 | メッセージコード | メッセージ内容 | 表示条件 |
|--------------|----------------|--------------|----------|
| エラー | - | Server Error | 常時表示（本番環境） |

**多言語対応**：メッセージは `__('Server Error')` ヘルパー関数を使用しており、言語ファイルにより翻訳可能です。

**デバッグモード**：`APP_DEBUG=true` の場合、この画面ではなく詳細なエラー情報を含むデバッグ画面が表示されます。

## 例外処理

本画面自体が例外処理の結果として表示されるため、画面内での例外処理は定義されていません。テンプレートのレンダリングに失敗した場合は、Symfony の HtmlErrorRenderer によるフォールバック表示が行われます。

## 備考

- この画面は `minimal.blade.php` レイアウトを継承しています
- `APP_DEBUG=true` の場合はこの画面ではなく、詳細なスタックトレースを含むデバッグ画面が表示されます
- エラーは Handler クラスの `report()` メソッドにより自動的にログに記録されます
- カスタマイズする場合は、`resources/views/errors/500.blade.php` にファイルを配置することで上書き可能です
- ダークモード対応のスタイリングが含まれています（`prefers-color-scheme: dark` メディアクエリ使用）
- セキュリティ上、本番環境では詳細なエラー情報をユーザーに表示しないことが重要です

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

例外処理の流れで渡されるデータ構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | HttpException.php | `vendor/symfony/http-kernel/Exception/HttpException.php` | HTTP 例外の基底クラス |
| 1-2 | Handler.php | `src/Illuminate/Foundation/Exceptions/Handler.php` | 未処理例外を HTTP 500 に変換するロジック |

**読解のコツ**: 未処理の例外は Handler クラスで HttpException(500) に変換されます。この変換は `prepareResponse()` メソッドの行 842-843 で行われます。

#### Step 2: 例外ハンドリングの流れを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Handler.php | `src/Illuminate/Foundation/Exceptions/Handler.php` | 例外ハンドラのメインクラス |

**主要処理フロー**:
1. **行 838-848**: `prepareResponse()` メソッドでデバッグモードチェックと例外変換
2. **行 842-843**: 非 HTTP 例外を HttpException(500) に変換
3. **行 920-938**: `renderHttpException()` メソッドで HTTP 例外のレンダリングを実行
4. **行 922**: `registerErrorViewPaths()` でエラービューのパスを登録
5. **行 958-968**: `getHttpExceptionView()` でステータスコードに基づくビュー名を決定

#### Step 3: ログ記録の流れを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Handler.php | `src/Illuminate/Foundation/Exceptions/Handler.php` | report() メソッド |

**主要処理フロー**:
- `report()` メソッドでエラーをログに記録
- `$dontReport` 配列で報告しない例外を設定可能

#### Step 4: テンプレート継承を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | 500.blade.php | `src/Illuminate/Foundation/Exceptions/views/500.blade.php` | 500 エラー専用テンプレート |
| 4-2 | minimal.blade.php | `src/Illuminate/Foundation/Exceptions/views/minimal.blade.php` | 共通レイアウトテンプレート |

**主要処理フロー**:
- **500.blade.php 行 1**: `@extends('errors::minimal')` で共通レイアウトを継承
- **500.blade.php 行 3-5**: `@section` でタイトル、コード、メッセージを定義

### プログラム呼び出し階層図

```
未処理の例外発生
    │
    ├─ Handler::report()
    │      └─ ログに記録
    │
    ├─ Handler::render()
    │      │
    │      └─ Handler::prepareResponse()
    │             │
    │             ├─ デバッグモードチェック
    │             │      ├─ true: Symfony デバッグ画面
    │             │      └─ false: 続行
    │             │
    │             └─ 例外を HttpException(500) に変換
    │                    │
    │                    └─ Handler::renderHttpException()
    │                           │
    │                           ├─ Handler::registerErrorViewPaths()
    │                           │
    │                           └─ Handler::getHttpExceptionView()
    │                                  └─ view()->exists('errors::500')
    │
    └─ response()->view('errors::500', [...])
           └─ 500.blade.php
                  └─ minimal.blade.php（継承）
```

### データフロー図

```
[入力]                    [処理]                         [出力]

未処理の例外        ───▶ Handler
                          │
                          ├─ report()
                          │      └─ ログ出力
                          │
                          ├─ config('app.debug') チェック
                          │      ├─ true: Symfony デバッグ
                          │      └─ false: エラーページ
                          │
                          ├─ 例外 → HttpException(500) 変換
                          │
                          ├─ renderHttpException()
                          │      │
                          │      └─ getHttpExceptionView()
                          │             └─ 'errors::500'
                          │
                          └─ response()->view()   ───▶ HTTP Response
                                 │                      (status: 500)
                                 └─ Blade レンダリング
                                        │
                                        ├─ 500.blade.php
                                        │
                                        └─ minimal.blade.php
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| 500.blade.php | `src/Illuminate/Foundation/Exceptions/views/500.blade.php` | テンプレート | 500 エラー専用のコンテンツ定義 |
| minimal.blade.php | `src/Illuminate/Foundation/Exceptions/views/minimal.blade.php` | テンプレート | エラー画面の共通レイアウト |
| Handler.php | `src/Illuminate/Foundation/Exceptions/Handler.php` | ソース | 例外ハンドリング、ログ記録、ビュー選択のロジック |
| RegisterErrorViewPaths.php | `src/Illuminate/Foundation/Exceptions/RegisterErrorViewPaths.php` | ソース | エラービューパスの登録処理 |
| LogManager.php | `src/Illuminate/Log/LogManager.php` | ソース | ログ出力の管理 |
