blocs/admin: 新規作成・編集機能のカスタマイズ
blocs/admin: 新規作成・編集機能のカスタマイズ
自動生成された管理画面の新規作成・編集機能をカスタマイズする方法を説明します。入力フォーム、バリデーション、確認画面、競合検出などを要件に合わせて調整できます。
前提条件: 自動生成ツールで管理画面を生成済みであること
テンプレートの一覧
共通テンプレートは resources/views/admin/base/entry に格納されています。
| テンプレート名 | 用途 |
|---|---|
| header.html | 画面上部のヘッダー部分 |
| footer.html | 画面下部のフッター部分 |
| include/entry.html | 編集画面の共通レイアウトテンプレート |
| include/form.html | 入力フォームの部品テンプレート |
| create.blocs.html | 新規作成画面のメインテンプレート |
| edit.blocs.html | 編集画面のメインテンプレート |
| confirmStore.blocs.html | 新規作成の確認画面(任意・追加時) |
| confirmUpdate.blocs.html | 更新の確認画面(任意・追加時) |
処理フロー
初期状態では モーダル で登録・更新を確認します(詳しくは No.1.2 / No.5.4)。confirmStore / confirmUpdate ルートおよび確認画面テンプレートは自動生成に含まれません。専用確認画面を使う場合のみ、以下の「パターンB」のフローになります。
★ はオーバーライドによるカスタマイズポイントです。
新規作成フロー
パターンA: モーダル確認(デフォルト)
flowchart TD
subgraph create["create — 入力画面表示"]
direction TB
c1["prepareCreate ★ — 表示データ準備"]
c2["outputCreate — 入力画面表示"]
c1 --> c2
end
modal["(モーダルで確認)"]
subgraph store["store — 新設処理"]
direction TB
s1["validateStore ★ — 入力データの検証"]
s2["prepareStore ★ — 登録データ準備"]
s3["executeStore ★ — データ登録"]
s4["logStore ★ — ログ記録"]
s5["outputStore — 完了処理"]
s1 --> s2 --> s3 --> s4 --> s5
end
c1 --> c2
c2 --> modal
modal --> s1
パターンB: 専用確認画面(任意・追加時)
flowchart TD
subgraph create["create — 入力画面表示"]
direction TB
c1["prepareCreate ★ — 表示データ準備"]
c2["outputCreate — 入力画面表示"]
c1 --> c2
end
subgraph confirm["confirmStore — 確認画面表示"]
direction TB
cf1["validateStore ★ — 入力データの検証"]
cf2["prepareConfirmStore ★ — 表示データ準備"]
cf3["outputConfirmStore — 確認画面表示"]
cf1 --> cf2 --> cf3
end
subgraph store["store — 新設処理"]
direction TB
s1["validateStore ★ — 入力データの検証"]
s2["prepareStore ★ — 登録データ準備"]
s3["executeStore ★ — データ登録"]
s4["logStore ★ — ログ記録"]
s5["outputStore — 完了処理"]
s1 --> s2 --> s3 --> s4 --> s5
end
c2 --> cf1
cf3 --> s1
編集フロー
パターンA: モーダル確認(デフォルト)
flowchart TD
subgraph edit["edit — 編集画面表示"]
direction TB
e1["getCurrent ★ — 編集データ取得"]
e2["prepareEdit ★ — 表示データ準備"]
e3["outputEdit — 入力画面表示"]
e1 --> e2 --> e3
end
modal["(モーダルで確認)"]
subgraph update["update — 更新処理"]
direction TB
u1["getCurrent ★ — 編集データ取得"]
u2["validateUpdate ★ — 入力データの検証"]
u3["checkConflict ★ — 衝突確認"]
u4["prepareUpdate ★ — 登録データ準備"]
u5["executeUpdate ★ — データ登録"]
u6["logUpdate ★ — ログ記録"]
u7["outputUpdate — 完了処理"]
u1 --> u2 --> u3 --> u4 --> u5 --> u6 --> u7
end
e1 --> e2
e3 --> modal
modal --> u1
パターンB: 専用確認画面(任意・追加時)
flowchart TD
subgraph edit["edit — 編集画面表示"]
direction TB
e1["getCurrent ★ — 編集データ取得"]
e2["prepareEdit ★ — 表示データ準備"]
e3["outputEdit — 入力画面表示"]
e1 --> e2 --> e3
end
subgraph confirm["confirmUpdate — 確認画面表示"]
direction TB
c1["getCurrent ★ — 編集データ取得"]
c2["validateUpdate ★ — 入力データの検証"]
c3["prepareConfirmUpdate ★ — 表示データ準備"]
c4["outputConfirmUpdate — 確認画面表示"]
c1 --> c2 --> c3 --> c4
end
subgraph update["update — 更新処理"]
direction TB
u1["getCurrent ★ — 編集データ取得"]
u2["validateUpdate ★ — 入力データの検証"]
u3["checkConflict ★ — 衝突確認"]
u4["prepareUpdate ★ — 登録データ準備"]
u5["executeUpdate ★ — データ登録"]
u6["logUpdate ★ — ログ記録"]
u7["outputUpdate — 完了処理"]
u1 --> u2 --> u3 --> u4 --> u5 --> u6 --> u7
end
e3 --> c1
c4 --> u1
ベースコントローラーのメソッド
新規作成関連
| 可視性 | メソッド名 | 処理内容 |
|---|---|---|
| public | create | 新規作成画面を表示 |
| protected | prepareCreate | 出力のためのデータ処理 ★ |
| protected | outputCreate | ビューの出力処理 |
| public | confirmStore | 入力内容の確認画面を表示 |
| protected | validateStore | 入力値のバリデーション ★ |
| protected | prepareConfirmStore | 出力のためのデータ処理 ★ |
| protected | outputConfirmStore | ビューの出力処理 |
| public | store | 新規登録処理 |
| protected | prepareStore | 出力のためのデータ処理 ★ |
| protected | executeStore | データの新規登録 ★ |
| protected | outputStore | ビューの出力処理 |
編集関連
| 可視性 | メソッド名 | 処理内容 |
|---|---|---|
| public | edit | 編集画面を表示 |
| protected | prepareEdit | 出力のためのデータ処理 ★ |
| protected | outputEdit | ビューの出力処理 |
| public | confirmUpdate | 入力内容の確認画面を表示 |
| protected | validateUpdate | 入力値のバリデーション ★ |
| protected | prepareConfirmUpdate | 出力のためのデータ処理 ★ |
| protected | outputConfirmUpdate | ビューの出力処理 |
| public | update | 編集処理の実行 |
| protected | checkConflict | 編集の競合(同時編集)の確認 ★ |
| protected | prepareUpdate | 出力のためのデータ処理 ★ |
| protected | executeUpdate | データの更新処理 ★ |
| protected | outputUpdate | ビューの出力処理 |
ベースコントローラーの主な変数
| 変数名 | 説明 |
|---|---|
| $this->request | 現在のリクエスト情報。フォームの入力値やURLパラメータを取得 |
| $this->tableData | 編集対象のデータ。データベースから取得したレコード |
メソッドの共有関係
ベースコントローラー内部では、以下のメソッド呼び出し関係があります。
prepareEdit()は内部でprepareCreate()を呼び出します。prepareCreate()をオーバーライドすると、新規作成画面だけでなく編集画面にも影響します。prepareUpdate()は内部でprepareStore()を呼び出します。prepareStore()をオーバーライドすると、新規登録処理だけでなく更新処理にも影響します。
編集画面や更新処理だけに固有のロジックを追加したい場合は、prepareEdit() / prepareUpdate() をオーバーライドし、parent::prepareEdit() / parent::prepareUpdate() を呼び出した後に追加処理を記述してください。
ログデータの自動生成
executeStore() および executeUpdate() は、処理の中で自動的に $this->logData を構築します。ログ記録のために手動で $this->logData を設定する必要はありません。
確認画面のセッションデータについて
専用確認画面(confirmStore / confirmUpdate / confirmDestroy / confirmSelect)では、確認画面表示時にリクエストデータを Laravel のフラッシュセッションへ保存し、確定処理(store / update / destroy / select)で復元します。
セッションキー
キーは {viewPrefix}.confirm です(例: admin.user.confirm)。登録・更新・削除・一括削除で同一キーを共有します(No.4.3 参照)。別種別の確認画面を同時に使う設計には注意してください。
フラッシュの有効期限
フラッシュデータは次の1リクエストでのみ有効です。確認画面表示後に別ページへ遷移してから戻ると、入力データは失われます。
確定処理時のバリデーション
専用確認画面経由で確定 POST された場合、セッションに確認データがあれば validateStore() / validateUpdate() 等はスキップされ、セッション内容を $request にマージして処理します(確認画面表示時に既に検証済みのため)。モーダル確認からの直接 POST では、従来どおり validate*() が実行されます。
編集時に現在のデータを取得する方法
コントローラー内で $this->getCurrent($id) を使用します。取得したデータはフォームの初期値表示や編集前の確認に利用できます。
編集の競合確認を有効にする方法
複数ユーザーによる同時編集の競合を検出するには、テンプレート内で updated_at の値を hidden フィールドとして送信します。
<input type="hidden" name="updated_at" />
checkConflict() はリクエストに updated_at が含まれている場合のみ動作します。hidden フィールドがなければ競合チェックはスキップされます。競合が検出された場合、編集画面にエラーメッセージ付きでリダイレクトされます。
確認画面の追加方法
管理画面の初期状態では モーダル による確認が行われます(詳しくは No.5.4 を参照)。専用の確認画面を追加するには以下の手順で実装します。
1. 確認画面用テンプレートの作成
resources/views/... 配下に confirmStore.blocs.html を作成し、入力内容の表示や「登録」ボタンを配置します。
2. 確認画面を表示するルートの定義
confirmStore / confirmUpdate は POST でリクエストを受け取ります。
Route::post('/confirmStore', [UserController::class, 'confirmStore'])->name('confirmStore');
Route::post('/{id}/confirmUpdate', [UserController::class, 'confirmUpdate'])->where('id', '[0-9]+')->name('confirmUpdate');
3. 新規作成画面から確認画面へ遷移するボタンを設置
<!-- data-bloc="buttonBottomCenter" -->
<!-- :formaction=route(prefix().".confirmStore") -->
<!--
data-include="button"
$buttonType="submit"
$buttonClass="btn btn-primary"
$buttonIcon="fa-solid fa-arrow-right"
$buttonLabel="確認"
-->
<!-- data-endbloc -->
注: confirmStore / confirmUpdate ルートおよび確認画面テンプレートも、自動生成には含まれません。モーダル確認から専用確認画面へ切り替える場合に追加してください。