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: モーダル確認(デフォルト)
create ─── 入力画面表示
├─ prepareCreate ★ .......... 表示データ準備
└─ outputCreate .............. 入力画面表示
│
▼(モーダルで確認)
store ─── 新設処理
├─ validateStore ★ .......... 入力データの検証
├─ prepareStore ★ ........... 登録データ準備
├─ executeStore ★ ........... データ登録
├─ logStore ★ ............... ログ記録
└─ outputStore ............... 完了処理
パターンB: 専用確認画面(任意・追加時)
create ─── 入力画面表示
├─ prepareCreate ★ .......... 表示データ準備
└─ outputCreate .............. 入力画面表示
│
▼
confirmStore ─── 確認画面表示
├─ validateStore ★ .......... 入力データの検証
├─ prepareConfirmStore ★ .... 表示データ準備
└─ outputConfirmStore ........ 確認画面表示
│
▼
store ─── 新設処理
├─ validateStore ★ .......... 入力データの検証
├─ prepareStore ★ ........... 登録データ準備
├─ executeStore ★ ........... データ登録
├─ logStore ★ ............... ログ記録
└─ outputStore ............... 完了処理
編集フロー
パターンA: モーダル確認(デフォルト)
edit ─── 編集画面表示
├─ getCurrent ★ ............. 編集データ取得
├─ prepareEdit ★ ............ 表示データ準備
└─ outputEdit ................ 入力画面表示
│
▼(モーダルで確認)
update ─── 更新処理
├─ getCurrent ★ ............. 編集データ取得
├─ validateUpdate ★ ......... 入力データの検証
├─ checkConflict ★ .......... 衝突確認
├─ prepareUpdate ★ .......... 登録データ準備
├─ executeUpdate ★ .......... データ登録
├─ logUpdate ★ .............. ログ記録
└─ outputUpdate .............. 完了処理
パターンB: 専用確認画面(任意・追加時)
edit ─── 編集画面表示
├─ getCurrent ★ ............. 編集データ取得
├─ prepareEdit ★ ............ 表示データ準備
└─ outputEdit ................ 入力画面表示
│
▼
confirmUpdate ─── 確認画面表示
├─ getCurrent ★ ............. 編集データ取得
├─ validateUpdate ★ ......... 入力データの検証
├─ prepareConfirmUpdate ★ ... 表示データ準備
└─ outputConfirmUpdate ....... 確認画面表示
│
▼
update ─── 更新処理
├─ getCurrent ★ ............. 編集データ取得
├─ validateUpdate ★ ......... 入力データの検証
├─ checkConflict ★ .......... 衝突確認
├─ prepareUpdate ★ .......... 登録データ準備
├─ executeUpdate ★ .......... データ登録
├─ logUpdate ★ .............. ログ記録
└─ outputUpdate .............. 完了処理
ベースコントローラーのメソッド
新規作成関連
| 可視性 | メソッド名 | 処理内容 |
|---|---|---|
| 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)のデータは、Laravelのフラッシュデータとして保存されます。フラッシュデータは1回のリクエストでのみ有効です。ユーザーが確認画面で別のページに遷移してから戻った場合、入力データは失われます。
編集時に現在のデータを取得する方法
コントローラー内で $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 ルートおよび確認画面テンプレートも、自動生成には含まれません。モーダル確認から専用確認画面へ切り替える場合に追加してください。