# 画面設計書 28-404エラーページ

## 概要

本ドキュメントは、Shopware 6 Storefrontの404エラーページの画面設計書である。リクエストされたページが見つからない場合に表示されるエラー画面について記載する。

### 本画面の処理概要

404エラーページは、存在しないURLにアクセスした場合や、削除されたコンテンツにアクセスした場合に表示されるエラー画面である。

**業務上の目的・背景**：ユーザーが存在しないページにアクセスした場合、適切なエラーメッセージを表示し、ホームページへの誘導を行うことで、ユーザー体験の低下を最小限に抑える。また、管理者はシステム設定から専用のCMSページを404エラーページとして設定でき、ブランドに合ったカスタムエラーページを提供できる。

**画面へのアクセス方法**：
- 存在しないURLへのアクセス
- 削除された商品・カテゴリ・CMSページへのアクセス
- 無効なルートへのアクセス

**主要な操作・処理内容**：
1. エラーメッセージの表示
2. ホームページへのリンク提供
3. カスタム404ページの表示（設定されている場合）

**画面遷移**：
- 遷移元：任意のページ（存在しないURL）
- 遷移先：ホームページ

**権限による表示制御**：
- 特になし（全ユーザーに表示）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 67 | エラーページ | 主機能 | ページが見つからない場合のエラー表示（ErrorController::error） |

## 画面種別

エラー

## URL/ルーティング

| ルート名 | URL | HTTPメソッド | 説明 |
|----------|-----|--------------|------|
| なし | 任意の存在しないURL | GET | 404エラー発生時に表示 |

※ ErrorControllerはルートを持たず、例外発生時にSymfonyのエラーハンドリング機構から呼び出される

## 入出力項目

### 入力項目

| 項目名 | パラメータ名 | 型 | 必須 | 説明 |
|--------|-------------|-----|------|------|
| 例外 | exception | \Throwable | 必須 | 発生した例外 |
| リクエスト | request | Request | 必須 | HTTPリクエスト |
| コンテキスト | context | SalesChannelContext | 必須 | 販売チャネルコンテキスト |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| page | ErrorPage | エラーページオブジェクト（カスタムCMSページ設定時） |
| exception | \Throwable | 例外情報（フォールバック時） |

## 表示項目

### デフォルト404ページ

| 項目名 | データソース | 説明 |
|--------|-------------|------|
| エラー画像 | assets/illustration/404_error.svg | 404エラーイラスト |
| エラータイトル | general.404ErrorPageHeader | 「ページが見つかりません」等 |
| エラー説明 | general.404ErrorDescription | エラーの説明文 |
| ホームへ戻るボタン | general.404ErrorReturn | ホームページへのリンク |

### カスタム404ページ

管理画面の「設定 > 基本設定 > HTTP 404ページ」で設定されたCMSページを表示

## イベント仕様

### 1-エラー処理

HttpExceptionでステータスコードが404の場合、以下の処理を行う：
1. core.basicInformation.http404Page設定を確認
2. 設定がある場合、ErrorPageLoaderでCMSページを読み込み
3. 設定がない場合、デフォルトテンプレート（error-404.html.twig）を使用

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

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | - | SELECT | 参照のみ（CMSページ取得） |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| general.404ErrorPageHeader | 表示 | ページが見つかりません | ページタイトル |
| general.404ErrorDescription | 表示 | お探しのページは見つかりませんでした | エラー説明 |
| general.404ErrorReturn | 表示 | ホームへ戻る | ボタンテキスト |

## 例外処理

| 例外 | 原因 | 処理内容 |
|------|------|----------|
| HttpException (404) | ページが存在しない | 404エラーページを表示 |
| PageNotFoundException | カスタムCMSページが存在しない | デフォルトテンプレートにフォールバック |

## 備考

- HTTPステータスコード404を返却
- セッションにフラッシュメッセージがある場合は表示後にクリア
- カスタム404ページが設定されている場合はCMSページを使用
- _page.html.twigを継承し、簡易なヘッダー・フッターを表示

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ErrorPage.php | `src/Storefront/Page/Navigation/Error/ErrorPage.php` | cmsPageプロパティ |

**読解のコツ**: ErrorPageはCMSページを持つことができ、カスタム404ページとして表示される。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ErrorController.php | `src/Storefront/Controller/ErrorController.php` | error()メソッド |

**主要処理フロー**:
1. **35行**: error()メソッド定義（\Throwable, Request, SalesChannelContext受け取り）
2. **40-41行**: 404ステータスコードの判定
3. **50-51行**: カスタム404ページ設定の取得
4. **51-57行**: カスタムCMSページの読み込み・表示
5. **58-61行**: デフォルトテンプレートへのフォールバック
6. **64-65行**: HTTPステータスコードの設定

#### Step 3: ページローダーを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ErrorPageLoader.php | `src/Storefront/Page/Navigation/Error/ErrorPageLoader.php` | load()メソッド |

**主要処理フロー**:
- **39-56行**: load() - CMSページを読み込み、ErrorPageを作成

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | error-404.html.twig | `src/Storefront/Resources/views/storefront/page/error/error-404.html.twig` | デフォルト404ページ |
| 4-2 | _page.html.twig | `src/Storefront/Resources/views/storefront/page/error/_page.html.twig` | エラーページベース |

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

```
Symfony ErrorHandler
    │
    └─ ErrorController::error()
           │
           ├─ is404StatusCode判定
           │
           ├─ [カスタム404設定あり]
           │      │
           │      ├─ systemConfigService.getString('core.basicInformation.http404Page')
           │      │
           │      ├─ ErrorPageLoader::load()
           │      │      ├─ GenericPageLoader::load()
           │      │      ├─ SalesChannelCmsPageLoader::load()
           │      │      └─ ErrorPageLoadedEvent dispatch
           │      │
           │      └─ renderStorefront('index.html.twig')
           │
           └─ [カスタム404設定なし]
                  │
                  ├─ ErrorTemplateResolver::resolve()
                  │
                  └─ renderStorefront('error-404.html.twig')
```

### データフロー図

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

HttpException (404)
         │
         ▼
 ErrorController::error()
         │
         ├─► is404StatusCode = true
         │
         ├─► cmsErrorLayoutId = systemConfig.get('core.basicInformation.http404Page')
         │
         ├─► [cmsErrorLayoutId あり]
         │         │
         │         ▼
         │    ErrorPageLoader::load()
         │         │
         │         ├─► GenericPageLoader
         │         │
         │         └─► CmsPageLoader
         │                   │
         │                   └─► ErrorPage + CmsPage
         │                            │
         │                            ▼
         │                       index.html.twig
         │
         └─► [cmsErrorLayoutId なし]
                   │
                   ▼
              ErrorTemplateResolver
                   │
                   └─► error-404.html.twig
                            │
                            ▼
                       Response (status=404)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ErrorController.php | `src/Storefront/Controller/ErrorController.php` | コントローラー | エラー処理 |
| ErrorPageLoader.php | `src/Storefront/Page/Navigation/Error/ErrorPageLoader.php` | ページローダー | CMSページ読み込み |
| ErrorPage.php | `src/Storefront/Page/Navigation/Error/ErrorPage.php` | ページエンティティ | エラーページデータ |
| ErrorTemplateResolver.php | `src/Storefront/Framework/Twig/ErrorTemplateResolver.php` | サービス | テンプレート解決 |
| error-404.html.twig | `src/Storefront/Resources/views/storefront/page/error/error-404.html.twig` | テンプレート | デフォルト404ページ |
| _page.html.twig | `src/Storefront/Resources/views/storefront/page/error/_page.html.twig` | テンプレート | エラーページベース |
| index.html.twig | `src/Storefront/Resources/views/storefront/page/content/index.html.twig` | テンプレート | カスタムCMSページ用 |
