# 画面設計書 64-キャッシュ設定

## 概要

本ドキュメントは、Shopware 6 管理画面（Administration）におけるキャッシュ設定画面の設計を記述したものです。システムキャッシュのクリアやインデックスの更新を行うための管理者向け操作画面です。

### 本画面の処理概要

キャッシュ設定画面は、Shopwareシステムのパフォーマンス関連の操作を行う画面です。データキャッシュのクリア、全キャッシュのクリア、各種インデクサーの実行などを管理者が直接実行できます。

**業務上の目的・背景**：ECサイトのパフォーマンス最適化において、キャッシュ管理は重要な要素です。商品情報の更新後や設定変更後にキャッシュをクリアすることで、最新の情報が顧客に表示されるようになります。また、検索インデックスやカテゴリ階層などの各種インデクサーを手動で実行することで、データの整合性を確保できます。

**画面へのアクセス方法**：管理画面にログイン後、左メニューの「設定」 > 「システム」セクション > 「キャッシュとパフォーマンス」をクリックしてアクセスします。URL パスは `#/sw/settings/cache/index` です。

**主要な操作・処理内容**：
1. **データキャッシュのクリア**：遅延（delayed）方式でデータキャッシュをクリア
2. **全キャッシュのクリア**：HTTPキャッシュを含む全てのキャッシュをクリア
3. **インデックス更新**：選択したインデクサーを実行してデータインデックスを更新
4. **インデクサーの選択**：スキップまたは実行のみのインデクサーを選択
5. **システム情報の表示**：環境（dev/prod）、HTTPキャッシュ状態、キャッシュアダプターを表示

**画面遷移**：
- 遷移元：設定一覧画面（sw-settings-index）
- 遷移先：なし（操作画面のため）

**権限による表示制御**：
- `system.clear_cache`：キャッシュ設定へのアクセスおよびキャッシュクリア操作が可能

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 70 | コンテキスト切替 | 補助機能 | キャッシュのクリア・設定 |

## 画面種別

操作

## URL/ルーティング

| 項目 | 値 |
|------|---|
| モジュール名 | sw-settings-cache |
| メインルート | sw.settings.cache.index |
| URLパス | #/sw/settings/cache/index |

## 入出力項目

### インデックス更新設定

| 項目名 | 項目ID | 型 | 必須 | 説明 |
|--------|--------|-----|------|------|
| インデクシングモード | indexingMethod | String | Yes | 'skip'（スキップ）または 'only'（選択のみ実行） |
| インデクサー選択 | indexerSelection | Array<String> | No | 対象インデクサー名のリスト |

## 表示項目

### システム情報ツールバー

| セクション | 表示項目 | 説明 |
|------------|----------|------|
| 環境 | environmentValue | 開発環境（dev）または本番環境（prod） |
| HTTPキャッシュ | httpCacheValue | HTTPキャッシュの有効/無効状態 |
| キャッシュアダプター | cacheAdapterValue | 使用中のキャッシュアダプター名 |

### キャッシュ操作セクション

| セクション | 表示項目 | 説明 |
|------------|----------|------|
| データキャッシュクリア | ボタン | データキャッシュのみをクリア |
| 全キャッシュクリア | ボタン | 全てのキャッシュをクリア |
| インデックス更新 | モード選択 | skip/only の選択 |
| インデックス更新 | インデクサー選択 | 対象インデクサーのチェックボックスリスト |
| インデックス更新 | 実行ボタン | インデックス更新を実行 |

### 利用可能なインデクサー

| インデクサー | 子インデクサー |
|-------------|--------------|
| category.indexer | category.child-count, category.tree, category.breadcrumb, category.seo-url |
| customer.indexer | customer.many-to-many-id-field |
| landing_page.indexer | landing_page.many-to-many-id-field, landing_page.seo-url |
| media.indexer | - |
| media_folder.indexer | media_folder.child-count |
| media_folder_configuration.indexer | - |
| payment_method.indexer | - |
| product.indexer | product.inheritance, product.stock, product.variant-listing, product.child-count, product.many-to-many-id-field, product.category-denormalizer, product.cheapest-price, product.rating-average, product.stream, product.search-keyword, product.seo-url |
| product_stream.indexer | - |
| product_stream_mapping.indexer | - |
| promotion.indexer | promotion.exclusion, promotion.redemption |
| rule.indexer | rule.payload |
| sales_channel.indexer | sales_channel.many-to-many |
| flow.indexer | - |
| newsletter_recipient.indexer | - |

## イベント仕様

### 1-データキャッシュクリアボタン押下

**トリガー**: 「データキャッシュをクリア」ボタンクリック

**処理フロー**:
1. `clearDataCache` メソッドが実行される
2. 開始通知を表示
3. `cacheApiService.delayed()` APIを呼び出し
4. 成功時: 成功通知を表示、ボタンが成功状態に変化
5. 失敗時: エラー通知を表示

**データフロー**:
```
ボタンクリック → cacheApiService.delayed() → API → キャッシュクリア実行
```

### 2-全キャッシュクリアボタン押下

**トリガー**: 「全キャッシュをクリア」ボタンクリック

**処理フロー**:
1. `clearCache` メソッドが実行される
2. 開始通知を表示
3. `cacheApiService.clear()` APIを呼び出し
4. 成功時: 成功通知を表示、ボタンが成功状態に変化
5. 失敗時: エラー通知を表示

### 3-インデックス更新ボタン押下

**トリガー**: 「インデックス更新」ボタンクリック

**処理フロー**:
1. `updateIndexes` メソッドが実行される
2. インデクシングモードに応じて skip/only リストを構築
3. `cacheApiService.index(skip, only)` APIを呼び出し
4. ワーカープロセスのポーリング間隔を一時的に短縮（60秒間）
5. 開始通知を表示
6. バックグラウンドで処理実行

### 4-インデクサー選択変更

**トリガー**: インデクサーチェックボックスの変更

**処理フロー**:
1. `changeSelection` メソッドが実行される
2. `indexerSelection` 配列に追加または削除
3. 親インデクサーが選択されると、子インデクサーは自動的に無効化

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| データキャッシュクリア | - | - | キャッシュストレージをクリア（DBではない） |
| 全キャッシュクリア | - | - | キャッシュストレージをクリア（DBではない） |
| インデックス更新 | 各種 | UPDATE/INSERT | 各インデクサーに応じたテーブルを更新 |

### インデクサー別データベース影響

| インデクサー | 影響テーブル | 処理内容 |
|-------------|-------------|---------|
| category.indexer | category | child_count, path, breadcrumb 更新 |
| product.indexer | product, product_search_keyword | 継承、在庫、検索キーワード等の更新 |
| promotion.indexer | promotion | 除外条件、利用回数の更新 |
| rule.indexer | rule | ペイロードの再計算 |

## メッセージ仕様

| 種別 | メッセージキー | メッセージ内容 | 表示条件 |
|------|--------------|--------------|---------|
| 情報 | sw-settings-cache.notifications.clearDataCache.started | データキャッシュのクリアを開始しました | データキャッシュクリア開始時 |
| 成功 | sw-settings-cache.notifications.clearDataCache.success | データキャッシュをクリアしました | データキャッシュクリア成功時 |
| エラー | sw-settings-cache.notifications.clearDataCache.error | データキャッシュのクリアに失敗しました | データキャッシュクリア失敗時 |
| 情報 | sw-settings-cache.notifications.clearCache.started | キャッシュのクリアを開始しました | 全キャッシュクリア開始時 |
| 成功 | sw-settings-cache.notifications.clearCache.success | キャッシュをクリアしました | 全キャッシュクリア成功時 |
| エラー | sw-settings-cache.notifications.clearCache.error | キャッシュのクリアに失敗しました | 全キャッシュクリア失敗時 |
| 情報 | sw-settings-cache.notifications.index.started | インデックスの更新を開始しました | インデックス更新開始時 |

## 例外処理

| 例外状態 | 対応処理 | 画面表示 |
|---------|---------|---------|
| 権限不足 | 画面アクセス不可 | 設定メニューに表示されない |
| API通信エラー | エラー通知表示 | エラーメッセージを通知で表示 |
| キャッシュクリア失敗 | エラー通知表示 | 「キャッシュのクリアに失敗しました」メッセージ |
| インデックス更新失敗 | 処理状態リセット | ボタンが通常状態に戻る |

## 備考

- データキャッシュクリアは遅延（delayed）方式で実行され、即時には完了しない場合があります
- 全キャッシュクリアはHTTPキャッシュを含むため、一時的にサイトのパフォーマンスが低下する可能性があります
- インデックス更新はバックグラウンドで実行され、処理完了は通知システムで確認できます
- インデックス更新開始後、ワーカープロセスのポーリング間隔が60秒間短縮されます
- 環境情報は cacheApiService.info() API から取得されます

---

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

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

### 推奨読解順序

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

キャッシュ設定画面ではエンティティを直接操作せず、API経由でキャッシュ操作を行います。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | cacheApiService | `src/Administration/Resources/app/administration/src/core/service/api/` | キャッシュAPI サービスの定義 |

**読解のコツ**: キャッシュ操作は API サービス経由で行われ、バックエンドのコントローラーで実際の処理が実行されます。

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

処理の起点となるモジュール登録とルーティングを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.js | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/index.js` | モジュール登録とルート定義 |

**主要処理フロー**:
1. **9-10行目**: コンポーネントの遅延ロード登録
2. **14-42行目**: `Module.register` でモジュールを登録
3. **25-34行目**: ルート定義（index）
4. **36-41行目**: 設定メニューへの項目追加（systemグループ）

#### Step 3: ページコンポーネントを理解する

メインページコンポーネントの構造を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sw-settings-cache-index/index.js | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/page/sw-settings-cache-index/index.js` | ページのメインロジック |
| 3-2 | sw-settings-cache-index.html.twig | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/page/sw-settings-cache-index/sw-settings-cache-index.html.twig` | テンプレート構造 |

**主要処理フロー**:
- **38-86行目**: インデクサー一覧の定義
- **96-125行目**: システム情報の computed プロパティ
- **146-152行目**: `createdComponent` でキャッシュ情報取得
- **169-194行目**: `clearDataCache` でデータキャッシュクリア
- **196-221行目**: `clearCache` で全キャッシュクリア
- **223-250行目**: `updateIndexes` でインデックス更新

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

```
sw-settings-cache-index (Page)
    │
    ├─ cacheApiService
    │      ├─ info() [システム情報取得]
    │      ├─ delayed() [データキャッシュクリア]
    │      ├─ clear() [全キャッシュクリア]
    │      └─ index(skip, only) [インデックス更新]
    │
    └─ notification Store
           └─ workerProcessPollInterval [ポーリング間隔制御]
```

### データフロー図

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

キャッシュクリア    ───▶   cacheApiService.clear()    ───▶  キャッシュストレージ
                                   │                        (Redis/File等)
                                   ▼
インデクサー選択    ───▶   updateIndexes()            ───▶  バックグラウンドジョブ
                           │
                           └─▶ cacheApiService.index()
                                   │
                                   ▼
                           Worker Notification
                                   │
                                   └─▶ 処理完了通知
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.js | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/index.js` | ソース | モジュール登録・ルート定義 |
| sw-settings-cache-index/index.js | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/page/sw-settings-cache-index/index.js` | ソース | ページメインロジック |
| sw-settings-cache-index.html.twig | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/page/sw-settings-cache-index/sw-settings-cache-index.html.twig` | テンプレート | ページテンプレート |
| sw-settings-cache-modal/index.js | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/component/sw-settings-cache-modal/index.js` | ソース | キャッシュモーダルコンポーネント |
| acl/index.js | `src/Administration/Resources/app/administration/src/module/sw-settings-cache/acl/index.js` | ソース | 権限定義 |
